具体来说,我有TabPane,我想知道是否有具有特定ID的元素。如何使用lambda表达式检查元素是否存在?
所以,我想在Java中使用lambda表达式来做到这一点:
boolean idExists = false;
String idToCheck = "someId";
for (Tab t : tabPane.getTabs()){
if(t.getId().equals(idToCheck)) {
idExists = true;
}
}
具体来说,我有TabPane,我想知道是否有具有特定ID的元素。如何使用lambda表达式检查元素是否存在?
所以,我想在Java中使用lambda表达式来做到这一点:
boolean idExists = false;
String idToCheck = "someId";
for (Tab t : tabPane.getTabs()){
if(t.getId().equals(idToCheck)) {
idExists = true;
}
}
尝试使用Lambda表达式的anyMatch
。这是更好的方法。
boolean idExists = tabPane.getTabs().stream()
.anyMatch(t -> t.getId().equals(idToCheck));
虽然接受的答案是正确的,我将添加一个更优雅版(在我看来):
boolean idExists = tabPane.getTabs().stream()
.map(Tab::getId)
.anyMatch(idToCheck::equals);
不要忽视使用Stream#map()允许申请前扁平化的数据结构Predicate
。
上面的答案要求你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))) {
...
}
这里有什么更好?我只看到一次手术。对不起,我是这个lamba的新手。 – TecHunter
@TecHunter它更加明确。想象一下你第一次阅读这段代码,或者过一段时间后再读这段代码。有几个优点:首先,我们立即表明我们对该选项卡没有真正的兴趣,但有一些映射。其次,通过使用方法引用(这是唯一可能的,因为我们将初始lambda分成两步),我们显示代码中没有隐藏的意外。第三,通过使用方法引用,我们不创建一个新的谓词,但实际上只是重用了'equals'。虽然,理所当然,这里的例子非常简单,但我希望你明白我的意思。 –
@MalteHartwig谢谢!是的,我得到了你的3分,但我用“地图”询问了这个扁平化,它做了另一个处理步骤否?我会尝试比较2种方法:) – TecHunter