JAVA Stream API란?
in Programming on Java
java8부터 추가된 Stream API 에 대해 알아보자
1. 스트림(Stream)이란?
데이터 원소의 유한 혹은 무한 Sequence. (서로 연관이 있으면서 특별한 순서를 가진 것들의 집합)
2. 스트림 파이프라인(Stream pipeline)이란?
원소들로 수행하는 연산 단계를 표현하는 개념.
소스스트림(source stream) -> 중간 연산(intermediate operation) -> 종단 연산(terminal operation)
3. java의 Stream API
데이터 소스를 추상화하고 데이터를 다루는데 자주 사용되는 메서드들을 정의. 데이터를 추상화함으로써 데이터 소스가 무엇이든 동일한 방식으로 데이터를 다룰 수 있게됨. (-> 코드의 재사용성이 높아짐)
//Stream 사용 전
String[] strArr = { "java", "python", "go" }
List<String> strList = Arrays.asList(strArr);
Arrays.sort(strArr);
Collections.sort(strList);
for(String str: strArr) {
System.out.println(str);
}
for(String str : strList) {
System.out.println(str);
}
//Stream 사용 후
Stream<String> listStream = strList.stream();
Stream<String> arrayStream = Arrays.stream(strArr);
listStream.sorted().forEach(System.out::println);
arrayStream.sorted().forEach(System.out::println);
4. Stream 특징
- Stream은 데이터소스를 변경하지않음. 필요하다면 정렬된 결과를 컬렉션에 담아 반환해야함.
List<String> sortedList = listStream.sorted().collect(Collections.toList());
- Stream은 일회용임. 한번사용하면 닫혀서 사용할 수 없음
listStream.sorted().forEach(System.out::print); int numOfElement = listStream.count(); //에러. 스트림이 이미 닫힘
- Stream은 작업을 내부반복으로 처리함. (반복문을 메서드 내부에 숨길수있음)
5. Stream 생성
스트림으로 작업을 하려면, 스트림을 생성해야함. Stream의 소스가 될 수 있는 객체는 배열, 컬렉션, 파일 등 다양함.
1) Collection
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> listStream = list.stream();
2) Array
Stream<String> strStream = Stream.of(new String[] {"a", "b", "c"});
Stream<String> strStream = Arrays.stream(new String[] {"a", "b", "c"});
6. Stream 연산
1) 중간 연산(intermediate operation)
스트림을 어떠한 방식으로 변환(transform). 연산결과를 스트림으로 반환하기 때문에 중간 연산을 연속해서 연결할 수 있다.
ex) map(), flatMap()
2) 종단 연산(terminal operation)
중간연산이 내놓은 stream에 최후의 연산 수행. 스트림의 요소를 소모하면서 연산을 수행하기 때문에 단 한번만 연산이 가능. ex) 원소를 출력
ex) 특정 원소 하나를 선택
ex) reduce(), collect()
7. 병렬 stream
parallel()이라는 메서드를 호출하면 연산을 병렬로 수행 가능
int sum = strStream.parallel()
.mapToInt(s -> s.length())
.sum();
참고 : effective java, https://effectivesquid.tistory.com/entry/Java-Stream%EC%9D%B4%EB%9E%80