Java Stream接口具有两个方法,即findFirst()和findAny() 。 两种方法看起来非常相似,但是在某些情况下它们的行为可能有所不同。 在本文中,学习findFirst()和findAny()方法之间的区别 。
1. Stream findFirst() method
1.1. DescriptionOptional findFirst()
此方法返回一个Optional描述此流的第一个元素 。 如果流有:
defined encounter order –流中遇到顺序中的第一个元素。
no encounter order –可以返回任何元素。
上面的理论对所有顺序流和并行流均无效,并且findFirst()的行为不会改变。
1.2. Stream findFirst() exampleimport java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
//sequential stream
Stream.of("one", "two", "three", "four")
.findFirst()
.ifPresent(System.out::println);
//parallel stream
Stream.of("one", "two", "three", "four")
.parallel()
.findFirst()
.ifPresent(System.out::println);
}
}
Program output.one
one
2. Stream findAny() method
2.1. DescriptionOptional findAny()
此方法返回一个Optional描述此流的any元素 。 如果流有:defined encounter order –可以返回任何元素。
no encounter order –可以返回任何元素。
上面的理论对所有顺序流和并行流均findAny()并且findAny()的行为不会改变。在非并行流中,在大多数情况下, findAny()将返回第一个元素,但这种行为不会得到保证。
Stream.findAny()在并行流的情况下引入Stream.findAny()方法以提高性能。
2.2. Stream findAny() exampleimport java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
//sequential stream
Stream.of("one", "two", "three", "four")
.findAny()
.ifPresent(System.out::println);
//parallel stream
Stream.of("one", "two", "three", "four")
.parallel()
.findAny()
.ifPresent(System.out::println);
}
}
Program output.one
three
3. Stream findFirst() vs findAny() – Conclusion
在本文中,我们了解了Java 8 Stream API findFirst()和findAny()方法之间的区别。 在非并行流中,在大多数情况下,两者都可能返回流的第一个元素,但是findAny()不提供此行为的任何保证。
使用findAny()可以更快地从任何并行流中获取任何元素。 在大多数情况下,我们总是可以使用findFirst() 。
Reference :