🔶 자바의정석Ch14(람다와스트림)-15~16,17~22
✔ 자바의정석Ch14-15 스트림(Stream)
- 스트림 : 다양한 데이터 소스(컬렉션,배열)를 표준화(CF - list,set,map)된 방법으로 다루기 위한 것
=> 데이터의 연속적인 흐름 
- 스트림이 제공하는 기능 : 중간 연산 & 최종 연산
1) 중간 연산 : 연산결과가 스트림인 연산, 반복적으로 적용 가능하다
2) 최종 연산 : 연산결과가 스트림이 아닌 연산, 단 한번만 적용가능하다(스트림의 요소를 소모한다) 
✔ 자바의정석Ch14-16 스트림(Stream)의 특징
🎈 스트림(Stream)의 특징 (1/3)
- 스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다 => Read Only , 원본 변경 없음
- 스트림은 Iterator 처럼 일회용이다(필요하면 다시 스트림을 생성해야 한다)
- 최종 연산 전까지 중간연산이 수행되지 않는다 => 지연된 연산 
🎈 스트림(Stream)의 특징 (2/3)
- 스트림은 작업을 내부 반복으로 처리한다 
🎈 스트림(Stream)의 특징 (3/3)
- 스트림의 작업을 병렬로 처리한다 => 병렬스트림
- 기본형 스트림 : IntStream, LongStream, DoubleStream
1) 오토박싱&언박싱의 비효율이 제거된다(Stream<Integer>대신 IntStream 사용)
2) 숫자와 관련된 유용한 메서드를 Stream<T> 보다 더 많이 제공한다 
✔ 자바의정석Ch14-17 스트림 만들기 - 컬렉션
- Collection 인터페이스(list,set)의 stream()으로 컬렉션을 스트림으로 변환 
- EX
package Java_Nam; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class StreamEx { public static void main(String[] args) { // 리스트 생성 List<Integer> list = Arrays.asList(1,2,3,4,5); // 리스트 -> 스트림 => list를 데이터 소스로 하는 새로운 스트림 생성 Stream<Integer> intStream = list.stream(); // 스트림요소 출력 intStream.forEach(System.out::print); // forEach : 최종연산 System.out.println(); // Stream은 1회용, Stream에 대해 최종연산을 수행하면 Stream이 닫힌다 // 에러 출력 => 스트림이 최종연산 되었기 때문에 -> 스트림 다시 생성해서 출력해야 한다 intStream = list.stream(); // list로부터 stream을 생성 intStream.forEach(System.out::print); } }
✔ 자바의정석Ch14-18 스트림 만들기 - 배열
-
EX
// 1) Stream.of 메소드 사용 (가변인자 입력) Stream<String> strStream = Stream.of("a","b","c"); // 2) 배열로 넣기 String[] strArr = new String[] {"a","b","c","d"}; // 2-1) Stream<String> strStream = Stream.of(strArr); // OR // 2-2) Stream<String> strStream = Arrays.stream(strArr); // 3) 위의 식 한줄로 줄인것 Stream<String> strStream = Stream.of(new String[] {"a","b","c","d"}); // 4) Stream출력 strStream.forEach(System.out::println); // 1) IntStream 사용 => 기본형 스트림이 된다 // 기본스트림 : COUNT 메소드 이외에도 여러 메소드가 있다 => SUM,AVG 등... int[] intArr = {1,2,3,4,5}; IntStream intStream = Arrays.stream(intArr); // 2) Stream<Integer> 사용 => Integer객체 스트림이 된다 // COUNT 메소드 만 존재한다 Integer[] intArr = {1,2,3,4,5}; Stream<Integer> intStream = Arrays.stream(intArr); // 3) Stream출력 intStream.forEach(System.out::println);
✔ 자바의정석Ch14-19 스트림 만들기 - 임의의 수 (난수)
- EX
package Java_Nam; import java.util.Random; import java.util.stream.IntStream; public class StreamEx2 { public static void main(String[] args) { // Random클래스 객체 생성 .ints 메소드 호출 // int난수 스트림 반환 // 1) IntStream intStream = new Random().ints();// 무한스트림 // 2) IntStream intStream = new Random().ints(5,10); // 무한스트림, 범위 지정 => 5부터 10까지 => 10은 포함X // 3) IntStream intStream = new Random().ints(7,5,10); // limit 7개,5부터 10까지 // 스트림 출력 // limit(5) : 5개만 출력하기 intStream.limit(5).forEach(System.out::println); } }
✔ 자바의정석Ch14-20 스트림 만들기 - 특정 범위의 정수
✔ 자바의정석Ch14-21 스트림 만들기 - 람다식 iterate(), generate()
- EX
// iterate(T seed, UnaryPoerator(단항연산자) f) // 1) iterate() 이용해 짝수 스트림 생성 // n -> n + 2 : 람다식 Stream<Integer> intStream = Stream.iterate(2, n -> n + 2); // 1-2) iterate() 이용해 홀수 스트림 생성 Stream<Integer> intStream = Stream.iterate(1, n -> n + 2); // 1) Stream 출력 intStream.limit(10).forEach(System.out::println); // generate(Supplier s) : 주기만 하는것 입력X, 출력 O // 2) generate() 이용 : 1만 반복해서 출력 Stream<Integer> oneStream = Stream.generate(()->1); // 2) Stream 출력 oneStream.limit(10).forEach(System.out::println);