지금까지 수많은 데이터들을 컬렉션이나 배열에 담고 for문을 돌리거나 iteraotr을 사용하는 코드를 작성했다. 이러한 방법은 머구 길고 알아보기 힘들다
데이터 소스가 무엇이던 간에 같은 방식으로 다뤄 코드의 재사용성을 높이는 스트림 을 배워보자
스트림을 사용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 다룰수 있다.
스트림은 데이터 소스를 변경하지 않고 읽기만한다. 스트림은 일회용 이다.
스트림은 내부반복 처리를 한다.
1.중간연산 = 연산 결과가 스트림인 연산. 스트림에 연속해서 중간연산 가능
2.최종연산= 연산 결과가 스트림이 아닌 연산. 스트림의 요소를 소모하므로 한번만 가능.
스트림 연산에서 중간 연산을 호출해도 즉가적인 연산이 되는게 아니다. 최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다는 것이다.
중간 연산을 호출 하는것은 어떤 작업이 수행되어야 하는지를 지정해주는 것
뿐.
Stream<T> aaa= Collection.stream()
-> List<Integer>list = Arrays.asList(1,2,3,4,5)
-> Stream<Integer> intStream =list.stream();
->intStream.forEach(System.out::println) //출력 // 최종연산
->intStream.forEach(System.out::println) //에러// 스트림 닫힘
Stream<T> Stream.of(T...value)
Stream<T> Stream.of(T[])
-> Stream<String> - stream.of("a","b","c","d")
-> Stream<String> - stream.of(new String("a","b","c","d")
Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)
->Stream<String> - Arrays.stream(new String[]{"a","b"})
->Stream<String> - Arrays.stream(new String[]{"a","b"},0,3)
int,long,double 같은 기본형 배열을 소스로 하는 스트림을 생성하는 메서드도 있다.
IntStream IntStream.of(int....values)
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, startInclusive, int endExclusive))
IntStream IntStream.range(int begin, int end)
IntStream IntStream.rangeClosed(int begin, int end)
(range= end범위 포함x, rangeClosed= 포함 ㅇ)
IntStream ints()
LongStream longs()
DoubleStream dobles()
이 메서드들은 해당타입의 난수들로 이루어진 스트림 반환
이 메서드들이 반환하는 스트림은 크기가 정해지지 않은 무한 스트림이므로 limit()도 같이 사용해서 스트림을 재한 해 줘야한다.
ex)
IntStream intStream=new Random().ints(); // 무한 스트림
intStream.limit(5).forEach(System.out::println);//5개의 요소만 출력
IntStream ints(long streamSize)
LongStream longs(long streamSize)
DoubleStream dobles(long streamSize)
이 메서드들은 람다식을 매개변수로 받아 무한스트림 생성
이 메서드들은 기본형 스트림 타입의 참조변수를 다룰수 없다.
static <T> Stream<T> iterate(T seed, unaryOperator<T> f)
static <T> Stream<T> generate(Supplier<T.> s)
ex)
Stream<Integer.>evenStream= Stream.iterate(0,n->n+2);
ex)
Stream<Double.> raandomStream= Stream.generate(Math::random);
Stream<Integer.>oneStream= Stream.generate(()->1);
Stream<Path.> Files.list(Path dir)
Stream<String.> Files.lines(Path dir)
Stream<String.> lines()(Path dir)
Stream emptyStream= Stream.empty();
long count =emptyStream.count() // count값은 0// 스트림 요소 개수 반환
Stream<String.> str1 = Stream.of(Str1);
Stream<String.> str2 = Stream.of(Str2);
Stream<String.> str3 = Stream.concat(str1,str2) //두 스트림 연결