【问题标题】: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);

标签: java java-8 lambda


【解决方案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))) {
   ...
}

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2011-03-22
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多