[JAVA] 스트림(Stream) API 활용

2020. 8. 7. 15:03Programming Language/JAVA

반응형

스트림(Stream) 이란 ? 

스트림을 이용하면 선언형(질의로 표현할 수 있다)으로 컬렉션 데이터를 처리할 수 있다.

스트림은 배열(Arrays) 또는 컬렉션(collection) 처리, 관리하기에 유용한 기능을 지원한다.


※ 대표적인 메서드 

메서드 설명
void forEach(Consumer<? super T> action) 반복적으로 Stream의 원소를 순차적으로 추출하여 작업할때 사용된다.
<R> Stream<R> map(Function<? super T,
? extends R> mapper)
Stream 원소에 순차적으로 메서드를 적용한다.
<R,A> R collect(Collector<? super T,A,R> collector) Stream 의 반환형을 지정할때 사용된다.
Stream<T> distinct() Stream 원소의 중복을 제외한 Stream 을 반환한다.  
Stream<T> filter(Predicate<? super T> predicate) Stream 원소들 중 조건에 부합하는 Stream을 반환하다.
Stream<T> sorted(Comparator<? super T> comparator) 정렬된 Stream을 반환한다. 
default : 오름차순
Comparator.reverseOrder() : 내림차순
long count() Stream 원소의 갯수를 반환한다.
OptionalDouble average() Stream 원소들의 평균을 반환한다.
이때 double 형으로 변환하기 위해 getAsDouble 메서드와 
함께 자주 사용된다.
OptionalInt max() Stream 원소들의 최대값을 반환한다.
이때 int형으로 변환하기 위해 getAsInt 메서드와 
함께 자주 사용된다.
OptionalInt min() Stream 원소들의 최솟값을 반환한다.
이때 int형으로 변환하기 위해 getAsInt 메서드와 
함께 자주 사용된다.
int sum() Stream 원소들의 합계를 반환한다.
IntStream limit(long maxSize) Stream 원소들을 첫번째 원소부터 순차적으로 maxSize 값만큼의 Stream 원소들만 IntStream형으로 반환

■ forEach 메서드 활용

Stream의 원소들을 순차적으로 람다표현식을 활용하여 처리할 수 있게 지원한다.
// Collection의 stream 메서드를 이용하여 Stream 얻기
List<String> list = Arrays.asList("HAN", "HAN", "KANG", "KIM", "PARK", "HWANG");

// forEach 메서드		
list.stream().forEach(s -> System.out.println("forEach : " + s));

// ※ 출력결과
/*
forEach : HAN
forEach : HAN
forEach : KANG
forEach : KIM
forEach : PARK
forEach : HWANG
*/

map 메서드 활용

* Strean의 전체 원소를 소문자로 변환

Stream의 전체 원소에 적용시키고 싶은 메서드를 람다 표현식으로 작성한다.
// Collection의 stream 메서드를 이용하여 Stream 얻기
List<String> list = Arrays.asList("HAN", "HAN", "KANG", "KIM", "PARK", "HWANG");

// map 메서드
list.stream().map(s -> s.toLowerCase()).forEach(s -> System.out.println("map : " + s));

// ※ 출력결과
/*
map : han
map : han
map : kang
map : kim
map : park
map : hwang
*/

collect 메서드 활용

Stream의 반환형을 지정한다.
// Collection의 stream 메서드를 이용하여 Stream 얻기
List<String> list = Arrays.asList("HAN", "HAN", "KANG", "KIM", "PARK", "HWANG");

// collect 메서드
String collectStr = list.stream().collect(Collectors.joining(" "));
System.out.println("collect : " + collectStr);

// ※ 출력결과
// collect : HAN HAN KANG KIM PARK HWANG

distinct 메서드 활용

Stream의 원소의 중복을 제외하고 재정의한 Stream을 반환한다.
// Collection의 stream 메서드를 이용하여 Stream 얻기
List<String> list = Arrays.asList("HAN", "HAN", "KANG", "KIM", "PARK", "HWANG");

// distinct 메서드
list.stream().distinct().forEach(s -> System.out.println("distinct : " + s));

// ※ 출력결과
/*
distinct : HAN
distinct : KANG
distinct : KIM
distinct : PARK
distinct : HWANG
*/

filter 메서드 활용

* 예시 조건 : 원소들 중 시작문자열이 'H' 인 원소

Stream의 원소에 조건을 주어주고 부합할 경우의 원소들로만 재정의한 Stream을 반환한다. 
// Collection의 stream 메서드를 이용하여 Stream 얻기
List<String> list = Arrays.asList("HAN", "HAN", "KANG", "KIM", "PARK", "HWANG");

// filter 메서드
list.stream().filter(s -> s.startsWith("H")).forEach(s -> System.out.println("filter : " + s));

// ※ 출력결과
/*
filter : HAN
filter : HAN
filter : HWANG
*/

sorted 메서드 활용

* 참고) 내림차순 : sorted() 함수에 파라미터로 Comparator.reverseOrder() 대입 [sorted(Comparator.reverseOrder())]

Stream의 원소들을 정렬처리 한다. (디폴트 : 오름차순)
// Collection의 stream 메서드를 이용하여 Stream 얻기
List<String> list = Arrays.asList("HAN", "HAN", "KANG", "KIM", "PARK", "HWANG");

// sorted() 메서드
// 오름차순
list.stream().sorted().forEach(s -> System.out.println("sorted : " + s));

/*
※ 정렬 전 
forEach : HAN 
forEach : HAN 
forEach : KANG 
forEach : KIM 
forEach : PARK 
forEach : HWANG

※ 정렬 후 
sorted : HAN
sorted : HAN
sorted : HWANG
sorted : KANG
sorted : KIM
sorted : PARK
*/

count 메서드 활용

Stream 원소들의 갯수를 반환한다.
// Arrays 클래스의 stream 메서드를 이용하여 Stream 얻기
int[] intArr = { 5, 4, 3, 2, 2, 9 };

// count 메서드
long count = Arrays.stream(intArr).count();
System.out.println("갯수 : " + count);

// ※ 출력결과
// 갯수 : 6

average 메서드 활용

Stream 원소들의 평균을 반환한다.
단, 반환형이 OptionalDouble 이기때문에
double형으로 형변환 해주는 getAsDouble 메서드와 함께 자주 사용된다.
// Arrays 클래스의 stream 메서드를 이용하여 Stream 얻기
int[] intArr = { 5, 4, 3, 2, 2, 9 };

// average 메서드
double average = Arrays.stream(intArr).average().getAsDouble();
System.out.println("평균 : " + average);

// ※ 출력결과
// 평균 : 4.166666666666667

max 메서드 활용

Stream 원소들 중 최대값을 반환한다.
단, 반환형이 OptionalInt 이기 때문에
int 형으로 형변환 해주는 getAsInt 메서드와 함께 자주 사용된다.
// Arrays 클래스의 stream 메서드를 이용하여 Stream 얻기
int[] intArr = { 5, 4, 3, 2, 2, 9 };

// max 메서드
int max = Arrays.stream(intArr).max().getAsInt();
System.out.println("최대값 : " + max);

// ※ 출력결과
// 최대값 : 9

min 메서드 활용

Stream 원소들 중 최솟값을 반환한다.
단, 반환형이 OptionalInt 이기 때문에
int 형으로 형변환 해주는 getAsInt 메서드와 함께 자주 사용된다.
// Arrays 클래스의 stream 메서드를 이용하여 Stream 얻기
int[] intArr = { 5, 4, 3, 2, 2, 9 };

// min 메서드
int min = Arrays.stream(intArr).min().getAsInt();
System.out.println("최솟값 : " + min);

// ※ 출력결과
// 최솟값 : 2

sum 메서드 활용

Stream의 전체 원소의 합계를 반환한다.
// Arrays 클래스의 stream 메서드를 이용하여 Stream 얻기
int[] intArr = { 5, 4, 3, 2, 2, 9 };

// sum 메서드
int sum = Arrays.stream(intArr).sum();
System.out.println("합계 : " + sum);

// ※ 출력결과
// 합계 : 25

limit 메서드 활용

Stream의 첫번째 원소부터 원하는 길이만큼 잘라서 재정의된 Stream을 반환한다.
// Arrays 클래스의 stream 메서드를 이용하여 Stream 얻기
int[] intArr = { 5, 4, 3, 2, 2, 9 };

// limit 메서드
Arrays.stream(intArr).limit(3).forEach(n -> System.out.println("limit : " + n));

/*
※ 출력결과
limit : 5
limit : 4
limit : 3
*/

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com

반응형