-
Stream_3: 중간 연산자Language/Java 2023. 11. 25. 00:01
자르기 skip( ) , limit( )
skip(long n) // n개 건너뜀 limit(long maxSize) // 최대 maxSize개 반환
요소 걸러내기 filter( ) , distinct( )
// 중복 요소 제거 distinct() // 주어진 조건 p에 맞지 않는 요소 걸러냄 // 리턴타입이 boolean인 람다식으로 사용 가능 filter(Predicate<? super T> p)
정렬 sorted( )
sorted() sorted(Comparator<? super T> c) // comparator 대신 int 값을 반환하는 람다식을 사용하는것도 가능
+ Comparator 문자열 스트림 정렬 방법 소개
Comparator.naturalOrder() // 기본 정렬 Comparator.reverseOrder() // 기본 정렬의 역순 String.CASE_INSENSITIVE_ORDER // 대소문자 구분 X String.CASE_INSENSITIVE_ORDER.reversed() // 대소문자 구분X 역순 Comparator.comparing(String::length) // 길이 순 정렬 Comparator.comparingint(String::length) // no 오토박싱 길이 순 정렬 Comparator.comparing(String::length).reversed() // 길이 순 역순 정렬 Comparator.comparing(String::length).thenComparing(Comparator<T> c) // 정렬 조건 추가
변환 map( )
스트림의 요소에 저장된 값 중에서 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때 매개변수로 T 타입을 R 타입으로 변환해서 반환하는 함수를 지정해야 한다.
Stream<R> map(Function<? super T, ? extends R> mapper)
조회 peek( )
연산과 연산 사이에 올바르게 처리되었는지 확인하고 싶을 때 사용 forEach와 다르게 스트림 요소를 소모하지 않음
mapToInt( ) , mapToLong( ) , mapToDouble( )
Stream<String> -> IntStream 변환할 때
mapToInt(Integer::parseInt)
Stream<Integer> -> IntStream 변환할 때
mapToInt(Integer::intValue)
count()만 지원하는 Stream<T> 메서드와 달리, IntStream 같은 기본형 스트림은 아래와 같이 숫자를 다루는데 편리한
최종 연산
메서드들을 제공한다.int sum() // 스트림의 모든 요소의 총 합 OptionalDouble average() OptionalInt max() // 스트림의 요소 중 제일 큰 값 OptionalInt min() // 스트림의 요소 중 제일 작은 값
스트림의 요소가 하나도 없을 때, sum()은 0을 반환하지만, 다른 메서드들은 단순히 0을 반환할 수 없다. 그래서 나머지는 OptionalDouble, OptionalInt 자료형을 반환한다.
중요한 점으로 이 메서드들은 최종 연산이기 때문에 호출 후 스트림을 닫아버린다.
하나의 스트림에서 sum(), average() 등 여러 메서드를 한번에 호출할 수 없다.
여러 메서드를 한번에 호출하려면
summaryStatistics()
라는 메서드를 사용한다.// summaryStatistics() 사용 방법 IntSummaryStatistics stat = scoreStream.summaryStatistics(); long totCnt = stat.getCount(); long totSum = stat.getSum(); double avgScore = stat.getAverage(); int minScore = stat.getMin(); int maxScore = stat.getMax();
flatMap( ) _ Stream<T[ ]>를 Stream<T>로 변환
스트림의 요소가 배열이거나, map()의 연산 결과가 배열인 경우, 즉 스트림의 타입이 Stream<T[ ]>인 경우, Stream<T>로 다루는 것이 더 편리할 때가 있다. 그럴 떄는 map() 대신 flatMap()을 사용하면 된다.
// ex Stream<String[]> strArrStrm = Stream.of( new String[]{"abc", "asd", "sdf"}, new String[]{"ABC", "ASD", "FDS"} ); // 위의 스트림을 Stream<String> 타입으로 변환 Stream<String> strStream = strArrStrm.flatMap(Arrays::stream);
'Language > Java' 카테고리의 다른 글
Maven , Gradle (0) 2023.11.28 SQLite (0) 2023.11.25 Stream_2: 시작 연산자 (0) 2023.11.25 Stream_1: 소개 (0) 2023.11.25 자바의 정석 3판 _ 연습문제 02~03 오답 정리 (0) 2023.11.23