当前位置: 首页 > 知识库问答 >
问题:

按谓词查找第一个元素

韩靖琪
2023-03-14

我刚刚开始玩Java 8 lambda,我正在尝试实现一些我在函数式语言中习惯的东西。

例如,大多数函数语言都有某种对序列进行操作的find函数,或返回第一个元素的列表,该元素的谓词为true。我能看到的在《Java八号》中实现这一点的唯一方法是:

lst.stream()
    .filter(x -> x > 5)
    .findFirst()

然而,这似乎没有效率,因为过滤器将扫描整个列表,至少在我的理解(这可能是错误的)。有更好的办法吗?

共有2个答案

田骁
2023-03-14

然而,在我看来,这似乎是低效的,因为过滤器将扫描整个列表

不,它不会--一旦找到满足谓词的第一个元素,它就会“中断”。您可以在流包javadoc中阅读更多关于懒惰的内容,特别是(强调我的):

许多流操作(如过滤、映射或重复删除)可以懒洋洋地实现,从而暴露了优化的机会。例如,“查找具有三个连续元音的第一个字符串”不需要检查所有的输入字符串。流操作分为中间(产生流)操作和终端(产生价值或副作用)操作。中间操作总是懒惰的。

孔权
2023-03-14

否,筛选器不扫描整个流。它是一个中间操作,返回一个惰性流(实际上所有中间操作都返回一个惰性流)。为了说服您,您可以简单地进行以下测试:

List<Integer> list = Arrays.asList(1, 10, 3, 7, 5);
int a = list.stream()
            .peek(num -> System.out.println("will filter " + num))
            .filter(x -> x > 5)
            .findFirst()
            .get();
System.out.println(a);

输出:

will filter 1
will filter 10
10

您可以看到实际上只处理了流的前两个元素。

所以你可以用你的方法,这是完全好的。

 类似资料:
  • 问题内容: 我想要一种惯用的方式来找到与谓词匹配的列表中的第一个元素。 当前代码非常丑陋: 我已经考虑过将其更改为: 但是必须有一些更优雅的方法……如果返回一个值而不是没有找到匹配项引发异常,那将是一个很好的选择。 我知道我可以像这样定义一个函数: 但是,如果已经有内置的插件开始用这样的实用函数填充代码,这是很鸡肋的(人们可能不会注意到它们已经在那里,因此随着时间的推移它们会不断重复出现)。 问题

  • 我收集了< code > 我想找到“每种类型中的一种”,尽管我想找到产品集合中每个谓词的第一个匹配项。 目前我的代码如下: 但这当然会多次迭代产品集合,这是不需要的,因为在我的例子中,我有100000个产品和64个谓词,并且需要很长时间。 在我的特例中,谓词是互斥的:如果一个谓词返回true,那么对于该特定产品,所有其他谓词都可以跳过。因为我使用了< code>findFirst,所以对于所有其他

  • 使用Java8+,您可以轻松找到与匹配的集合的所有元素。

  • 我有一个对象列表,我想找到一个具有特定属性值的元素的索引。 例如 我知道用for循环写一个很容易,但是有没有任何现有的简单方法来做到这一点,比如流或任何库Util?

  • TestValue类是简单的pojo 这只是本地env,所有的东西都在我的机器上运行,单个Hazelcast实例。我的代码与官方文档中的示例相匹配。 Hazelcast版本:4.2.1

  • 本文向大家介绍Prolog元逻辑谓词,包括了Prolog元逻辑谓词的使用技巧和注意事项,需要的朋友参考一下 示例 关于实例化原因的谓词称为元逻辑。例如: var/1 ground/1 integer/1 这些谓词超出了纯单调逻辑程序的范围,因为它们破坏了像的可交换性之类的属性。 其他具有元逻辑的谓词包括: arg/3 functor/3 (=..)/2 这些谓词原则上可以在一阶逻辑中建模,但需要无