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의 활용과 람다식에 대해서 보다 깊이 있게 알아보도록 하겠습니다.
'Programing > JAVA' 카테고리의 다른 글
JDBC, DBCP란? 웹 어플리케이션의 DB접속에 대한 고찰 (0) | 2018.07.02 |
---|---|
Java boxing, unboxing 자바 박싱 언박싱 Wrapper Class 확실히 이해하기 (0) | 2018.06.12 |
Java List<VO> to JsonArray, String, StringBuilder, StringBuffer (0) | 2018.05.03 |
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC (0) | 2018.05.02 |
Java 오라클, 티베로, Mysql(MariaDB), Mssql 연동 (0) | 2018.04.06 |
댓글