-
26. 스트림개발자 수업/Java 2021. 10. 19. 17:51
1. 스트림의 의미
1) 데이터 집합체를 반복적으로 처리
2) 스트림을 이용하면 다수의 스레드 코드를 구현하지 않아도 데이터를 병렬로 처리
3) 스트림은 스트림 데이터와 스트림 연산의 개념을 모두 포함
2. 컬렉션과 스트림
컬렉션 스트림
1) 처리방식 다운로드 스트리밍
2) 저장공간 필요 불필요
3) 반복방식 외부반복 내부반복
4) 코드구현 명령형 선언형
5) 원본데이터 변경 변경하지 않고 소비
6) 연산병렬화 어려움 쉬움
3. 스트림 특징
1) 자료의 대상과 관계없이 동일한 연산을 수행
배열, 컬렉션을 대상으로 연산을 수행함
2) 한번 생성하고 사용한 스트림은 재사용 할 수 없음
자료에 대한 스트림을 생성하여 연산을 수행하면 스트림은 소모됨
다른 연산을 수행하기 위해서는 스트림을 다시 생성해야 함
3) 스트림 연산은 기존 자료를 변경하지 않음
4) 스트림 연산은 중간 연산과 최종 연산으로 구분됨(스트림 파이프라인)
스트림에 대해 중간 연산은 여러 개의 연산이 적용될 수 있지만
최종 연산은 마지막에 한 번만 적용됨
5) 최종 연산이 호출되어야 중간 연산에 대한 수행이 이루어지고 그 결과가 만들어짐import java.util.Arrays; import java.util.stream.IntStream; public class IntArrayStreamTest { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; for(int num : arr) { System.out.println(num); } System.out.println(); // IntStream을 생성하고 하나씩 꺼내는 연산자로 람다식으로 배열 내용을 출력 Arrays.stream(arr).forEach(n->System.out.println(n)); System.out.println(); // 위의 연산을 두 줄로 풀면 이렇게 됨 IntStream intStream = Arrays.stream(arr); intStream.forEach(n->System.out.println(n)); System.out.println(); // IntStream을 다시 사용하지 못함 한 번 연산이 되고 나서는 소모가 되버림 // 또 다른 연산을 하고자 한다면 다시 스트림을 생성해야 함 int sum = Arrays.stream(arr).sum(); System.out.println(sum); } }
import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; public class ArrayListStreamTest { public static void main(String[] args) { List<String> sList = new ArrayList<>(); sList.add("Welcome"); sList.add("to"); sList.add("ezenac"); Stream<String> stream = sList.stream(); // 컬렉션의 스트림 객체 생성 stream.forEach(s->System.out.println(s)); // 각각 출력함 // 또 다른 연산을 수행하려면 스트림을 다시 생성해야 함 // 정렬해서 출력함 // 정렬이 기존 자료인 sList를 변화시키진 않음 sList.stream().sorted().forEach(s->System.out.print(s+ "\t")); // Welcome ezenac to System.out.println(); // 스트림의 자체 연산을 수행하려면 map()을 사용하면 됨 // 스트림의 length를 가져와서 하나씩 length를 출력함 sList.stream().map(s->s.length()).forEach(n->System.out.print(n + "\t")); // 7 2 6 System.out.println(); // 스트림에서 length가 5보다 큰 것만 출력 sList.stream().filter(s->s.length()>=5).forEach(s->System.out.println(s)); } }
import java.util.ArrayList; import java.util.List; public class IntArrayStreamTest02 { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); int sum = list.stream().mapToInt(n->n.intValue()).sum(); System.out.println(sum); } }