当前位置: 首页 > 面试题库 >

Java 8流短路

高恺
2023-03-14
问题内容

阅读了有关Java
8的一些知识后,我进入了这篇博客文章,解释了有关流及其还原的一些知识,以及何时有可能使还原短路。在底部,它指出:

请注意,在findFirst或的情况下,findAny我们只需要与谓词匹配的第一个值(尽管findAny不能保证返回第一个)。但是,如果流没有排序,则我们的findFirst行为应类似于findAny。的操作allMatchnoneMatch并且anyMatch可能不会短路,因为在所有它的流可能需要评估所有的值,以确定操作者是否是truefalse。因此,使用它们的无限流可能不会终止。

我知道这一点,findFirst或者findAny可能会缩短还原,因为一旦找到一个元素,就无需进一步处理。

但是,为什么这是不可能的allMatchnoneMatchanyMatch?对于allMatch,如果找到与谓词不匹配的谓词,则可以停止处理。一样没有。而且anyMatch尤其是没有道理给我,因为它几乎等于findAny(除了返回什么)?

也可以这样说,这三个可能不会短路,因为它可能需要评估所有值findFirst/Any

我缺少一些根本的区别吗?我不是很了解发生了什么吗?


问题答案:

有一个细微的差异,因为anyMatchfamily使用谓词,而findAnyfamily不使用谓词。从技术上findAny()看起来anyMatch(x -> true)anyMatch(pred)看起来一样filter(pred).findAny()。因此,这里有另一个问题。考虑我们有一个简单的无限流

Stream<Integer> s = Stream.generate(() -> 1);

因此,确实如此,应用于findAny()此流将始终短路并完成,而anyMatch(pred)取决于谓词。但是,让我们过滤无限流:

Stream<Integer> s = Stream.generate(() -> 1).filter(x -> x < 0);

产生的流也无限吗?这是一个棘手的问题。它实际上不包含任何元素,但是要确定该元素(例如使用.iterator().hasNext()),我们必须检查无限数量的基础流元素,因此该操作将永远不会完成。我也将这种流称为无限。但是,同时使用此类流anyMatchfindAny永远不会完成:

Stream.generate(() -> 1).filter(x -> x < 0).anyMatch(x -> true);
Stream.generate(() -> 1).filter(x -> x < 0).findAny();

因此findAny()也不能保证完成,这取决于先前的中间流操作。

总而言之,我认为该博客文章具有误导性。我认为,在官方JavaDoc中可以更好地解释无限流的行为。



 类似资料:
  • 阅读了一下Java8,我读到了这篇博文,解释了一些关于流和它们的减少,以及什么时候可以短路减少。在底部,它说: 请注意,在个或我们只需要与谓词匹配的第一个值(尽管值不能保证返回第一个值)。但是,如果流没有排序,那么我们希望的行为类似于。所有、和 操作可能根本不会使流短路,因为可能需要计算所有值来确定运算符是还是。因此,使用这些的无限流可能不会终止。 我知道或可能会使还原短路,因为一旦您找到一个元素

  • 问题内容: 假设我有一个布尔值流,而我正在编写的reduce操作是||(OR)。我是否可以这样编写它:如果true遇到值,则放弃对至少某些元素的求值? 我正在寻找某种程度的优化(也许是并行流),不一定要完全优化,尽管后者会很棒。 问题答案: 我怀疑您想要这种构造。 你可以看一下 Stream.of(1, 2, 3, 4).peek(System.out::println).anyMatch(i -

  • 1 Java8 Stream流式编程的介绍 Java在Java 8中提供了一个新的附加程序包,称为java.util.stream。该软件包由类,接口和枚举组成,以允许对元素进行功能样式的操作。您可以通过导入java.util.stream包来使用流。 Stream提供以下功能: 流不存储元素。它只是通过计算操作的流水线从数据结构,数组或I/O通道等源中传递元素。 流本质上是功能性的。对流执行的操

  • 使用以下代码,我得到以下编译错误。我还尝试使用输入作为整数列表,而不是int[],这样做效果很好。如果我使用box(),它也可以正常工作。 我的问题真的是如果Int Stream必须是整数流,以及如何处理错误消息“lambda表达式int[]中的错误返回类型无法转换为int” 错误:(13,49)java:不兼容的类型: lambda表达式int[]中的错误返回类型无法转换为int错误:(13,6

  • 我想得到以下数据结构:Map 给定的是一个包含字段als原语(位置、目标、距离)或作为键(位置)加映射(目标)的类。从每个独特的位置,一个人可以瞄准多个目的地(按距离)。 关于第二个代码段:结果应该与第一个代码中的结果相同。唯一的区别是,LocationPair中提供的数据已被进一步处理,因此目的地和距离已被放入其目标地图中。 我知道这一定是可能的,但不知何故,我无法弄清楚如何完成它。上面的流代码

  • 此问题是之前问题的后续:使用Streams添加BigDecimals 这个问题与使用Java8和Lambda表达式添加有关。在实现给出的答案后,我遇到了另一个问题:每当流为空时,方法都会抛出一个。 考虑下面的代码: 香草Java代码对空集合没有问题,但是新的Java8代码有问题。 在这里避免NSEE最优雅的方式是什么?当然,我们可以做到: 但是有没有一种Java的方法来处理空集合?