最近,写法采用Java 8 Stream API引入两种经常被误解的方法:
findAny()
和
findFirst()
。
再次这两种方法之间的区别以及何时使用他进行做个笔记,
使用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());
assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D")));
在并行操作中,他可能会返回Stream中的第一个元素,但是对策不能保证。为了在处理并行操作时获得最佳性能,无法可靠地确定结果:
@Test
public void createParallelStream_whenFindAnyResultIsPresent_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());
assertThat(result.get(), anyOf(is(1), is(2), is(3)));
使用Stream.findFirst()
在使用findFirst()
方法查找在第一元素流。特别需要序列中的第一个元素时,将使用此方法。如果没有遇到顺序,他将从Stream返回任何元素。该`java.util.stream``包文件说:
流可能具有也可能没有定义的遇到顺序,他取决于源和中间操作
返回类型也是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())
assertThat(result.get(), is("A"))
在并行方案中,findFirst()
方法的行为不会更改。如果遇到顺序存在,它将始终具有确定性。
findAny()
方法返回从任何元素流而使用
findFirst()
方法返回在第一个元素流
Java 8 Stream findFirst()与findAny()