如何使用 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