[JAVA] 스트림(Stream) API 활용
2020. 8. 7. 15:03ㆍProgramming 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
반응형
'Programming Language > JAVA' 카테고리의 다른 글
[JAVA] 상속(extends)과 구현(implements)의 차이 (0) | 2020.09.24 |
---|---|
[JAVA] 객체 지향 프로그래밍(OOP : Object-Oriented Programming)의 특징 (0) | 2020.09.24 |
[JAVA] Arrays 클래스 활용 (배열 다루기) (0) | 2020.08.06 |
[JAVA] StringTokenizer 클래스 활용 (문자열 구분자로 자르기) (0) | 2020.08.06 |
[JAVA] JVM의 메모리 구조 (0) | 2020.08.05 |