본문 바로가기
Language/Java

[Java] 자바 스트림(stream) 사용법 3 - 최종 연산

by 계범 2022. 3. 16.

forEach()

스트림 내 요소를 매개변수 내용을 실행.

void forEach(Comsumer<? super T> action)

 

조건 검사 - allMatch(), anyMatch() ,noneMatch(), findFirst(), findAny()

스트림의 요소에 대해 지정된 조건에 요소가 일치하는지 확인하는데 사용할 수 있는 메서드들이다.

모두 매개변수로 Predicate를 요구하며, 연산결과로 boolean을 반환한다.

Predicate 참조

 

메서드 설 명
boolean allMatch(Predicate<? super T> predicate) 모든 요소가 일치하는지 확인.
boolean anyMatch(Predicate<? super T> predicate) 매치하는 것이 있는지 확인.
boolean noneMatch(Predicate<? super T> predicate) 매치하는게 없는지 확인.
Optional<T> findFirst(Predicate<? super T> predicate) 조건에 일치하는 첫 번째 것을 반환.
Optional<T> findAny(Predicate<? super T> predicate)
병렬스트림에서 조건에 일치하는 것을 반환.

 

통계 - count(), sum(), average(), max(), min()

IntStream과 같은 기본형 스트림에서 정보를 얻을 수 있는 메서드들이다.

2022.03.16 - [Language/Java] - [Java] 자바 스트림(stream) 사용법 2 - 스트림의 중간연산, Optional

 

기본형 스트림이 아니면 count(), max(), min() 3개뿐이다.

 

리듀싱 - reduce()

스트림의 요소를 줄여나가면서 연산을 수행하고 최종결과를 반환한다.

처음 두 요소를 가지고 연산한 결과를 가지고 그 다음 요소와 연산한다.

스트림의 모든 요소를 소모하게 되면 그 결과를 반환한다.

 

연산결과의 초기값을 가지는 reduce()도 있는데, 이 메서드들은 초기값과 스트림의 첫번 째 요소로 연산을 시작한다.

스트림의 요소가 하나도 없는 경우, 초기값이 반환되므로 반환타입이 T이다.

 

int count = intStream.reduce( 0 , (a,b) -> a + 1 );
int sum   = intStream.reduce( 0 , (a,b) -> a + b );

 

import java.util.*;
import java.util.stream.*;

class StreamEx5 {
	public static void main(String[] args) {
		String[] strArr = {
			"Inheritance", "Java", "Lambda", "stream",
			"OptionalDouble", "IntStream", "count", "sum"
		};

		Stream.of(strArr).forEach(System.out::println);

		boolean noEmptyStr = Stream.of(strArr).noneMatch(s->s.length()==0);
		Optional<String> sWord = Stream.of(strArr)
                                   	.filter(s->s.charAt(0)=='s').findFirst();

		System.out.println("noEmptyStr="+noEmptyStr);
		System.out.println("sWord="+ sWord.get());

		// Stream<String[]>을 IntStream으로 변환
		IntStream intStream1 = Stream.of(strArr).mapToInt(String::length);
		IntStream intStream2 = Stream.of(strArr).mapToInt(String::length);
		IntStream intStream3 = Stream.of(strArr).mapToInt(String::length);
		IntStream intStream4 = Stream.of(strArr).mapToInt(String::length);

		int count = intStream1.reduce(0, (a,b) -> a + 1);
		int sum   = intStream2.reduce(0, (a,b) -> a + b);

		OptionalInt max = intStream3.reduce(Integer::max);  
		OptionalInt min = intStream4.reduce(Integer::min);

		System.out.println("count="+count);
		System.out.println("sum="+sum);
		System.out.println("max="+ max.getAsInt());
		System.out.println("min="+ min.getAsInt());
	}
}
//결과
Inheritance
Java
Lambda
stream
OptionalDouble
IntStream
count
sum
noEmptyStr=true
sWord=stream
count=8
sum=58
max=14
min=3

 

참조

'Java의 정석' 책

댓글