🎯 목표 : Stream의 개념 과 활용 이해
📒 Stream
📌 특징
- 다양한 데이터 소스를 표준화 된 방법으로 다루기 위한 것.
- 데이터 소스를 추상화하고, 자주 사용하는 메소드가 정의되어 있음, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰수 있다. 코드의 재 사용성이 높아진다.
- 데이터 소스로 부터 데이터를 읽기만 하고 변경하지 않는다.
- 지연된 연산을 한다.
- 스트림의 작업은 내부 반복으로 처리된다.- 반복문을 메소드의 내부에 숨길수 있기 때문에 코드가 간결해진다.
for(String str : strList) System.out.println(str);
stream.forEach(System.out::println); // 위와 동일한 코드
// 내부 반복으로 작업을 하기 때문에 스트림의 모든 요소에 적용된다.
- 스트림은 중간연산과 최종연산을 할수 있는데, 최종연산을 하게되면 스트림의 요소를 소모하기 때문에 다시 연산을 하기위해서는 새로 생성해야된다. - 이터레이터와 비슷하다.
- 데이터 소스를 병렬 처리 가능하다. - 병렬스트림 parallel() - 멀티 쓰레드로 작업 처리
📌 스트림 생성
String [] arr = {"aa","ab","AA","bb","cc","CC"};
List<String> strList = Arrays.asList(arr);
Stream<String> streamarr = Arrays.stream(arr); // 스트림 생성
Stream<String> streamarr1= strList.stream(); // 스트림 생성
streamarr.sorted().forEach(System.out::print);
System.out.println();
streamarr1.sorted().forEach(System.out::print);
System.out.println();
// 출력값
// AACCaaabbbcc
// AACCaaabbbcc
int [] arr2 = {1,2,3,4,5,6,7}; // int 배열은 기본형 스트림으로 생성할수 있다.
IntStream intstream =Arrays.stream(arr2); // 기본형 스트림 생성
IntStream intStream1 = IntStream.of(arr2); // 기본형 스트림 생성
// Stream<Integer> 스트림으로 생성하려고 하면 형변환을 해줘야된다.
IntStream intStream1 = new Random().ints(1,46);
intStream1.distinct().limit(6).sorted().forEach(i->System.out.print(i+" "));
System.out.println();
// 1~45 숫자중 난수로 무한스트림을 생성하고.
// distinct() 중복제거
// limit() 길이만큼 자르기
// sorted() 정렬
- Steram 클래스 iterate() , generate()는 람다식을 매개변수로 받아서 스트림을 생성한다.
// iterate(T seed, UnaryOperator f) 단항연산자
Stream<Integer> intStream3 = Stream.iterate(0, n->n+2);
// 짝수 무한스트림.
// generate(Supplier s) 입력 x 출력 o
Stream<Integer> intStream4 = Stream.generate(()->5);
// 5 만 출력하는 무한스트림.