2014-04-11 84 views
57

具体来说,我有TabPane,我想知道是否有具有特定ID的元素。如何使用lambda表达式检查元素是否存在?

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

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

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

回答

138

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

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

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

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

不要忽视使用Stream#map()允许申请前扁平化的数据结构Predicate

+2

这里有什么更好?我只看到一次手术。对不起,我是这个lamba的新手。 – TecHunter

+2

@TecHunter它更加明确。想象一下你第一次阅读这段代码,或者过一段时间后再读这段代码。有几个优点:首先,我们立即表明我们对该选项卡没有真正的兴趣,但有一些映射。其次,通过使用方法引用(这是唯一可能的,因为我们将初始lambda分成两步),我们显示代码中没有隐藏的意外。第三,通过使用方法引用,我们不创建一个新的谓词,但实际上只是重用了'equals'。虽然,理所当然,这里的例子非常简单,但我希望你明白我的意思。 –

+0

@MalteHartwig谢谢!是的,我得到了你的3分,但我用“地图”询问了这个扁平化,它做了另一个处理步骤否?我会尝试比较2种方法:) – TecHunter

0

上面的答案要求你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))) { 
    ... 
}