Programing/JAVA

Java 8 Stream 을 사용해보자. About Stream in collection of java8

리커니 2018. 5. 23.
반응형

Java 8 Stream 을 사용해보자. About Stream in collection of java8

 

Java 8 버전 부터 컬렉션 프레임워크에 Stream 인터페이가 추가되었습니다.

이를 사용해 컬렉션 데이터의 변환, 필터링, 집계등의 처리를 간결하게 기술할 수 있게 되었습니다.

그리고 컬렉션 조작의 병렬화를 통해 처리를 쉽고 빠르게도 할 수 있습니다.

 

그럼 스트림을 생성하는 방법에 대해 알아보도록 하죠.

 

Collection 의 스트림을 얻는 경우

stream 메소드를 사용하여 스트림을 얻을 수 있습니다.

Integer[] intArray = {1,2,3,4,5,6,7,8,9};
List<Integer> list = Arrays.asList(intArray);
Stream<Integer> stList = list.stream();

Set<Integer> set = new HashSet<>();
Stream<Integer> stSet = set.stream();

Map<Integer, Integer> map = new HashMap<>();
Stream<Map.Entry<Integer, Integer>> stMap = map.entrySet().stream();

 

배열에 대해서도 Stream.of 와 Arrays.stream 메소드를 사용하여 Stream을 얻을 수 있습니다.

 

Integer[] intArray = {1,2,3,4,5,6,7,8,9};
Stream<Integer> stArray = Stream.of(intArray);
Stream<Integer> stArray2 = Arrays.stream(intArray);

 

이제 각 컬렉션들로부터 얻은 스트림을 활용하는 방법을 알아보도록 하죠.

스트림의 주요 메소드는 아래와 같습니다.

 

메소드명  설명 
 of  지정된 값으로부터 Stream 생성 
 count  Stream의 요소의 수를 반환 
 distinct  Stream의 요소의 중복 제거 
 forEach  Stream의 요소에 대한 반복 
 filter  Stream의 요소에 대한 필터링 
 concat  2개의 Stream을 연결 
 map  Stream의 요소를 변환 
 mapToDouble  Stream의 요소를 double형으로 변환해 DoubleStream 반환 
 mapToInt  Stream의 요소를 int형으로 변환해 IntStream으로 반환
 mapToLong  Stream의 요소를 long형으로 변환해 LongStream으로 반환
 floatMap  Stream의 요소를 변환하고 요소를 정리
 allMatch  Stream의 모든 요소가 조건을 충족하는지 확인
 anyMatch  Stream의 요소가 1개라도 충족하는지 확인
 noneMatch  Stream의 모든 요소가 충족하지 않는지 확인
 reduce  Stream의 요소 집계
 sum  Stream의 요소 합계
 sorted  Stream의 요소 정렬
 collect  Stream 요소의 집계 처리와 컬렉션 변환 등
 toArray  Stream을 배열로 변환
 iterate  무한값을 반환하는 Stream 생성
 limit  지정한 건수만큼 반환
 parallelStream  순차처리 Stream을 병렬 처리할 수 있는 Stream을 구함
 sequential  병렬 처리가 가능한 Stream을 순차처리 Stream으로 구함

 

그럼 간단히 스트림 메소드의 사용법을 알아보도록 하겠습니다.

 

String[] strArray = {"a2","a1","b1","c1","c3","c2","e1","d2","a3"};

 

위와 같은 스트링 배열이 있을 때 "a" 로 시작하는 요소만 오름차순 정렬해서 콘솔창에 찍어보도록 하겠습니다.

우선 배열을 스트림으로 변환하고,

 

Arrays.stream(strArray)

 

filter를 사용해 "a"로 시작하는 요소만 추려서

 

Arrays.stream(strArray).filter(s -> s.startsWith("a"))

 

오름차순 정렬한 후

 

Arrays.stream(strArray).filter(s -> s.startsWith("a")).sorted()

 

반복해서 콘솔창에 찍습니다.

 

Arrays.stream(strArray).filter(s -> s.startsWith("a")).sorted().forEach(s->System.out.println(s));

 

위처럼 콘솔창에 찍지 않고, 컬랙션으로 변환하는 방법을 알아보도록 하죠.

a로 시작하는 조건 대신에 모두 대문자로 변환해서 정렬한 리스트를 만들어 보겠습니다.

 

List<String> list = Arrays.stream(strArray).map(s -> s.toUpperCase()).sorted().collect(Collectors.toList());
list.stream().forEach(s -> System.out.println(s));

 

결과는

A1
A2
A3
B1
C1
C2
C3
D2
E1

 

위처럼 스트림의 요소를 변환할 때는 map 메소드를 사용합니다.

그리고 이를 컬렉션으로 변환할 때는 collect 메소드를 사용하고, 인수에는 Collectors 클래스에 정의된 변환용 메소드를 지정합니다.

Set으로 변환의 경우 Collectors.toSet()

배열로 변환의 경우 toArray() 메소드 사용 .toArray(String[]::new);

 

이처럼 스트림과 람다식을 활용하여 코드 라인을 줄일 수 있고, 속도 또한 향상될 수 있습니다.

 

다음 포스팅에서는 Stream의 활용과 람다식에 대해서 보다 깊이 있게 알아보도록 하겠습니다.

반응형

댓글

💲 추천 글