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

Mil*_*jac 106 java lambda java-8

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

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

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

for (Tab t : tabPane.getTabs()){
    if(t.getId().equals(idToCheck)) {
        idExists = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mas*_*dul 237

尝试使用anyMatchLambda Expression.这是更好的方法.

 boolean idExists = tabPane.getTabs().stream()
            .anyMatch(t -> t.getId().equals(idToCheck));
Run Code Online (Sandbox Code Playgroud)

  • 另外值得注意的是:如果你想否定支票,请使用`noneMatch`而不是`anyMatch`. (7认同)

jFr*_*tic 44

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

boolean idExists = tabPane.getTabs().stream()
    .map(Tab::getId)
    .anyMatch(idToCheck::equals);
Run Code Online (Sandbox Code Playgroud)

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

  • 这里有什么好处?我只看到一个操作.对不起,我是这个lamba的新手. (3认同)
  • @TecHunter它更明确.想象一下,您第一次阅读此代码,或者在一段时间后再次阅读此代码.有几个优点:首先,我们立即表明我们实际上并没有对标签感兴趣,而是对它进行了一些映射.其次,通过使用方法引用(这是可能的,因为我们将初始lambda分成两个步骤),我们表明代码中没有隐藏任何意外.第三,通过使用方法引用,我们不创建新的谓词,但实际上只是重复使用`equals`.尽管如此,这里的例子非常简单,但我希望你明白我的意思. (2认同)
  • @TecHunter吸气剂非常便宜.总是更喜欢代码清晰度而不是节省额外的2毫秒(即使我怀疑结果是准确的,它可能会在每次运行时波动).此外,请记住,对流(例如`map`)的中间操作本质上是*懒惰*.这意味着`getId`方法不适用于集合的每个元素.它被懒惰地评估,直到`anyMatch`返回**true**. (2认同)