如何使用 lambda 表达式检查元素是不是存在?

Posted

技术标签:

【中文标题】如何使用 lambda 表达式检查元素是不是存在?【英文标题】:How to check if element exists using a lambda expression?如何使用 lambda 表达式检查元素是否存在? 【发布时间】:2014-05-25 03:45:05 【问题描述】:

具体来说,我有 TabPane,我想知道其中是否有具有特定 ID 的元素。

所以,我想用 Java 中的 lambda 表达式来做到这一点:

boolean idExists = false;
String idToCheck = "someId";

for (Tab t : tabPane.getTabs())
    if(t.getId().equals(idToCheck)) 
        idExists = true;
    

【问题讨论】:

我会用简单的方法写,用 List.contains 方法清理。示例:return tabPane.getTabs().contains(idToCheck); 【参考方案1】:

尝试使用 anyMatch 的 Lambda 表达式。这是更好的方法。

 boolean idExists = tabPane.getTabs().stream()
            .anyMatch(t -> t.getId().equals(idToCheck));

【讨论】:

另外值得注意的是:如果你想否定检查使用noneMatch而不是anyMatch 调用需要 API 级别 24【参考方案2】:

虽然接受的答案是正确的,但我会添加一个更优雅的版本(在我看来):

boolean idExists = tabPane.getTabs().stream()
    .map(Tab::getId)
    .anyMatch(idToCheck::equals);

不要忽略使用Stream#map(),它允许在应用Predicate之前展平数据结构。

【讨论】:

这里有什么更好的地方?我只看到了另外一项操作。抱歉,我对这个 Lamba 不熟悉。 @TecHunter 它更明确。想象一下,您第一次阅读此代码,或者过一段时间再阅读一次。有几个优点:首先,我们立即表明我们实际上不是对选项卡感兴趣,而是对它的一些映射感兴趣。其次,通过使用方法引用(这可能是因为我们将初始 lambda 分成两个步骤),我们表明代码中没有隐藏任何意外。第三,通过使用方法引用,我们不会创建新的 Predicate,而实际上只是重用了equals。虽然,当然,这里的例子很简单,但我希望你明白我的意思。 @MalteHartwig 谢谢!是的,我得到了你的 3 分,但我问的是map 的扁平化,它做了另一个处理步骤,不是吗?我会尝试比较这两种方法:) @MalteHartwig 在 10kk ArrayList 中进行了测试,其中一个简单的对象试图找到最后一个元素。为您提供 131ms 与 133ms 的 2ms 差异。如果快 2 毫秒(55 毫秒到 53 毫秒),则在 1kk 数组列表中列出您的。所以我们可以说你的更好:) @TecHunter getter 非常便宜。总是更喜欢代码清晰而不是节省额外的 2 毫秒(尽管我怀疑结果是否准确,它可能会在每次运行时波动)。此外,请记住流上的中间操作(例如map)本质上是惰性。这意味着getId 方法不适用于集合的每个元素。在anyMatch 返回 true 之前,它会被延迟评估。【参考方案3】:

以上答案要求您 malloc 一个新的流对象。

public <T>
boolean containsByLambda(Collection<? extends T> c, Predicate<? super T> p) 

    for (final T z : c) 
        if (p.test(z)) 
            return true;
        
    
    return false;


public boolean containsTabById(TabPane tabPane, String id) 
    return containsByLambda(tabPane.getTabs(), z -> z.getId().equals(id));

...
if (containsTabById(tabPane, idToCheck))) 
   ...

【讨论】:

以上是关于如何使用 lambda 表达式检查元素是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

用于检查特定标签是不是不存在的 Lambda 函数-python

在 C# 中使用“Regex”检查字符串数组中是不是存在元素

使用 lambda boto3 检查 ec2 是不是存在

如何使用 Cypress.io 检查元素是不是存在

如何使用jq检查数组中是不是存在元素

如何在 Playwright.js 中检查页面上是不是存在元素