Java - Stream의 find, match 사용 방법 및 예제

Stream의 find 함수 findFirst(), findAny()와, match 함수 anyMatch(), allMatch(), noneMatch()에 대해서 소개합니다.

1. find 함수: findFirst(), findAny()

Stream의 find 함수는 findFirst()findAny()가 있습니다.

이 두개 함수는 모두 Stream에서 어떤 객체를 찾아서 객체를 리턴한다는 공통점이 있습니다.

차이점은, findFisrt()는 스트림의 순서를 고려하여 가장 앞에 있는 것을 리턴하고, findAny()는 Stream의 순서와 무관하게 먼저 탐색된 객체를 리턴합니다.

1.1 싱글 쓰레드에서 find 함수 사용

아래 예제는 findFirst()findAny()를 사용하여 특정 객체를 찾습니다. 두 함수 모두 동일한 객체 b를 리턴합니다. Stream이 싱글스레드에서 동작하기 때문에 리스트의 순서대로 탐색을 하기 때문에 b1보다 b를 먼저 찾기 때문입니다.

List<String> elements =
        Arrays.asList("a", "a1", "b", "b1", "c", "c1");
Optional<String> firstElement = elements.stream()
        .filter(s -> s.startsWith("b")).findFirst();
Optional<String> anyElement = elements.stream()
        .filter(s -> s.startsWith("b")).findAny();
firstElement.ifPresent(System.out::println);
anyElement.ifPresent(System.out::println);

Output:

b
b

싱글 쓰레드에서는 findAny()와 findFirst()의 큰 차이점이 없습니다. 멀티쓰레드에서 이 함수들을 사용해보면 리턴되는 결과의 차이점이 쉽게 보입니다.

1.2 멀티 쓰레드에서 find 함수 사용

Stream.parallel()은 Stream이 멀티 쓰레드에서 병렬로 수행되도록 합니다. 즉, 멀티쓰레드에서 Stream의 데이터를 탐색하면서 filter()가 수행되며, Stream의 데이터 순서와 다르게 탐색이 발생할 수 있습니다. (즉 아래 예제에서 b보다 b1이 먼저 탐색될 수 있다는 의미)

아래 예제에서 findAny()b1 또는 b 중에 가장 먼저 탐색된 것을 리턴합니다. 즉, b1이 먼저 탐색되면 b1이 리턴됩니다.

하지만 findFirst()를 사용하는 경우 b1이 먼저 탐색되었다고 해도, Stream의 순서를 고려하여, 가장 앞에 있는 객체 b를 리턴합니다.

List<String> elements =
        Arrays.asList("a", "a1", "b", "b1", "c", "c1");
firstElement = elements.stream().parallel()
        .filter(s -> s.startsWith("b")).findFirst();
anyElement = elements.stream().parallel()
        .filter(s -> s.startsWith("b")).findAny();

Output:

b
b1

2. match 함수: anyMatch(), allMatch(), noneMatch()

match 함수는 Stream에서 어떤 객체가 존재하는지 탐색을 하고 boolean 타입으로 결과를 리턴합니다.

match 함수는 anyMatch(), allMatch(), noneMatch()가 있습니다.

함수의 특징 및 리턴 값은 다음과 같습니다.

  • anyMatch()는 조건에 부합하는 객체가 1개라도 있으면 true 아니면 false를 리턴
  • allMatch()는 모든 객체가 조건에 부합해야 true 아니면 false를 리턴
  • noneMatch()는 반대로 조건에 부합하는 객체가 없어야 true 아니면 false를 리턴

다음과 같이 match 함수를 사용할 수 있습니다.

List<String> elements =
        Arrays.asList("a", "a1", "b", "b1", "c", "c1");

boolean anyMatch
        = elements.stream().anyMatch(s -> s.startsWith("b"));
System.out.println("anyMatch: " + (anyMatch ? "true" : "false"));

boolean allMatch
        = elements.stream().allMatch(s -> s.startsWith("b"));
System.out.println("allMatch: " + (allMatch ? "true" : "false"));

boolean noneMatch
        = elements.stream().noneMatch(s -> s.startsWith("b"));
System.out.println("noneMatch: " + (noneMatch ? "true" : "false"));

Output:

anyMatch: true
allMatch: false
noneMatch: false
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha