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
b12. 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: falseRelated Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedReader로 파일 읽기
- Java - BufferedWriter로 파일 쓰기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java charAt() 함수 알아보기
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기