Post

Java 8 Stream findFirst() 대 findAny()

1. Stream.findAny() 사용

이름에서 알 수 있듯이 findAny() 메서드를 사용하면 Stream에서 모든 요소를 ​​찾을 수 있다. 발생 순서에 주의를 기울이지 않고 요소를 찾을 때 이를 사용한다.

이 메서드는 Stream이 비어 있으면 비어 있는 Optional 인스턴스를 반환한다.

1
2
3
4
5
6
7
8
9
@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의 첫 번째 요소를 반환할 가능성이 높지만 이에 대한 보장은 없다.

병렬 작업을 처리할 때 최대 성능을 얻으려면 결과를 안정적으로 결정할 수 없다.

1
2
3
4
5
6
7
8
9
10
@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)));
}

2. Stream.findFirst() 사용

findFirst() 메소드는 Stream의 첫 번째 요소를 찾는다. 따라서 시퀀스의 첫 번째 요소를 구체적으로 원할 때 이 방법을 사용한다.

만남 순서가 없으면 Stream의 모든 요소를 ​​반환 한다. java.util.streams 패키지 문서에 따르면, “스트림은 정의된 발생 순서를 가질 수도 있고 그렇지 않을 수도 있다. 소스와 중간 작업에 따라 다르다.”

반환 유형은 Stream이 비어 있으면 비어 있는 Optional 인스턴스이기도 한다.

1
2
3
4
5
6
7
8
9
10
@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 메소드의 동작은 병렬 시나리오에서 변경되지 않는다. 만남 순서가 존재하는 경우 항상 결정론적으로 동작한다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.