HOME > java > java8

Java8의 Stream find, match 사용 방법

JSFollow15 Jul 2018

find

스트림에는 findFirst()findAny() 메소드가 있습니다. findFisrt는 스트림의 순서상 가장 첫번째 있는 것을 리턴해주고, findAny는 순서와 관계없이 먼저 찾아지는 객체를 리턴합니다.

아래 코드에서 findFirst와 findAny는 동일한 결과를 출력합니다. 스트림의 처리가 싱글스레드에서 동작하기 때문에 스트림의 첫번째 아이템부터 탐색을 하기 때문입니다. 가장 맨 앞에 있는 '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);

결과

b
b

stream().parallel()을 붙이면 스트림의 처리가 병렬로 동작됩니다. 즉, 멀티쓰레드에서 탐색이 수행됩니다. 따라서 스트림의 순서대로 탐색을 수행하지 않기 때문에 findAny는 b1 또는 b 중에 가장 먼저 찾은 것을 리턴합니다. findFirst는 병렬로 처리해도 순서에 우선순위를 두어 결과를 리턴해줍니다.

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();

결과

b
b1

match

match는 스트림에서 찾고자 하는 객체가 존재하는지 탐색을 하고 boolean 타입으로 결과를 리턴합니다. 메소드는 anyMatch(), allMatch(), noneMatch()가 있습니다.

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

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"));

결과

anyMatch: true
allMatch: false
noneMatch: false

참고