Java-8StreamfindFirst()和findAny()
Java-8 Stream findFirst() 和 findAny()
Java-8
1.简介
Java 8 Stream API引⼊了两种经常被误解的⽅法:findAny()和findFirst()。
在本教程中,我们将研究这两种⽅法之间的区别以及何时使⽤它们。
2. 使⽤Stream.findAny()
顾名思义,findAny()⽅法允许您从Stream中查任何元素。 在寻元素时使⽤时不会关注元素顺序。
该⽅法返回⼀个Optional实例,如果Stream为空,则该实例为空:
@Test
public void createStream_whenFindAnyResultIsPresent_thenCorrect() {
List<String> list = Arrays.asList("A","B","C","D");
Optional<String> result = list.stream().findAny();
assertTrue(result.isPresent());
(), anyOf(is("A"), is("B"), is("C"), is("D")));
}
在⾮并⾏操作中,它很可能返回Stream中的第⼀个元素,但不保证这⼀点。
为了在处理并⾏操作时获得最佳性能,也⽆法返回确定结果:
@Test
public void createParallelStream_whenFindAnyResultIsNotFirst_thenCorrect() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> result = list
.
stream().parallel()
.filter(num -> num < 4).findAny();
assertTrue(result.isPresent());
(), anyOf(is(1), is(2), is(3)));
}
3. 使⽤Stream.findFirst()
findFirst()⽅法查Stream中的第⼀个元素。 当您特别需要序列中的第⼀个元素时,可以使⽤此⽅法。
某些流的返回的元素是有确定顺序的,我们称之为 encounter order。这个顺序是流提供它的元素的顺序,⽐如数组的encounter order 是它的元素的排序顺序,List是它的迭代顺序(iteration order),
但是对于HashSet,它本⾝就没有encounter order。
所以如果流没有encounter order的时候,它返回Stream中的任何元素。
java.util.streams包⽂档:
java streamStreams may or may not have a defined encounter order. It depends on the source and the intermediate operations.
⼀个流是否是encounter order主要依赖数据源和它的中间操作。
返回类型也是⼀个Optional实例,如果Stream也为空,则该实例为空:
@Test
public void createStream_whenFindFirstResultIsPresent_thenCorrect() {
List<String> list = Arrays.asList("A", "B", "C", "D");
Optional<String> result = list.stream().findFirst();
assertTrue(result.isPresent());
(), is("A"));
}
findFirst⽅法的⾏为在并⾏⽅案中也不会更改。 如果是encounter order,则它将始终具有确定性。
4. 结论
在本教程中,我们研究了Java 8 Streams API的findAny() 和findFirst()⽅法。 findAny()⽅法返回Stream中的任何元素,⽽findFirst()⽅法返回Stream中的第⼀个元素。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论