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

Java 如何使用lambda表达式检查元素是否存在?,java,java-8,lambda,Java,Java 8,Lambda,具体来说,我有TabPane,我想知道其中是否有具有特定ID的元素 因此,我想用Java中的lambda表达式实现这一点: boolean idExists = false; String idToCheck = "someId"; for (Tab t : tabPane.getTabs()){ if(t.getId().equals(idToCheck)) { idExists = true; } } 尝试使用Lambda表达式。这是更好的方法 bool

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

因此,我想用Java中的lambda表达式实现这一点:

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

for (Tab t : tabPane.getTabs()){
    if(t.getId().equals(idToCheck)) {
        idExists = true;
    }
}
尝试使用Lambda表达式。这是更好的方法

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

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


在应用
谓词之前,请不要忽略使用它,它允许展平数据结构。上述答案要求您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))) {
   ...
}
公共

布尔值包含字节数(Collectionwhat is better here?我只看到了一个操作。很抱歉,我不熟悉这个lamba东西。@TecHunter它更明确。假设您第一次或一段时间后再次阅读此代码。它有几个优点:首先,我们立即表明我们实际上对选项卡不感兴趣,而是对它的一些映射感兴趣。其次,使用方法引用(这只可能是因为我们将初始lambda分解为两个步骤)第三,通过使用方法引用,我们并没有创建新的谓词,实际上只是重复使用
equals
。虽然,这里的例子很简单,但我希望你明白我的意思。@MalteHartwig谢谢!是的,我得到了你的3分,但我问的是
ma的扁平化问题p
,它执行另一个处理步骤否?我将尝试比较这两种方法:)@MalteHartwig在10kk数组列表中测试,并使用一个简单对象尝试查找最后一个元素。对于你的数组列表,131ms与133ms之间存在2ms的差异。在1kk数组列表中,如果你的速度快2ms(55ms到53ms),那么我们可以说你的更好:)@TecHunter吸气剂非常便宜。总是希望代码清晰,而不是节省额外的2毫秒(尽管我怀疑结果是否准确,但每次运行时可能会出现波动)。此外,请记住,流上的中间操作(如
map
)本质上是惰性的。这意味着
getId
方法不会应用于集合的每个元素。在
anyMatch
返回true之前,它会被惰性地计算。另外值得注意的是:如果要否定该检查,请使用
noneMatch
而不是
anyMatch
。调用需要API级别24I,使用简单的方式编写,并使用List.contains方法清除。示例:return tabPane.getTabs().contains(idToCheck);
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))) {
   ...
}