Steram<E> stream() // Collection 인터페이스의 메서드
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
// list를 데이터 소스로 하는 새로운 스트림을 생성
Stream<Integer> intStream = list.stream();
// 스트림의 모든 요소를 출력
// 메서드 참조를 람다식으로 바꾸면 (i) -> System.out.print(i)
intStream.forEach(System.out::print); // 12345
// forEach는 최종연산이므로 위에서 이미 수행되었기 때문에 stream이 닫혔다.
intStream.forEach(System.out::print); // 에러. 스트림이 이미 닫혔다.
Stream<T> Stream.of(T... values) // 가변 인자
Stream<T> Stream.of(T[])
Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)
// 결과는 동일
Stream<T> strStream = Stream.of("a", "b", "c"); // 가변 인자
Stream<T> strStream = Stream.of(new String[]{"a", "b", "c"});
Stream<T> strStream = Arrays.stream(new String[]{"a", "b", "c"});
Stream<T> strStream = Arrays.stream(new String[]{"a", "b", "c"}, 0, 3);
IntStream IntStream.of(int... values) // Stream이 아니라 IntStream
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int startInclusive, int endExclusive)
// 기본형 스트림(이 방법이 더 좋다. int형 메서드 지원)
int[] intArr = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(intArr);
intStream.forEach(System.out::println);
System.out.println(intStream.count()) // OK. 최종 연산
System.out.println(intStream.sum()) // OK. 최종 연산
System.out.println(intStream.average()) // OK. 최종 연산
// Integer 객체 스트림
// Stream<T>는 숫자외에도 여러 타입의 스트림이 가능해야 하므로 int형 스트림에만
// 사용할 수 있는 sum(), average()가 없다.
Integer[] intArr = {1, 2, 3, 4, 5}; // int[] 불가능
Stream<Integer> intStream = Arrays.stream(intArr);
intStream.forEach(System.out::println);
System.out.println(intStream.count()) // OK. 최종 연산
System.out.println(intStream.sum()) // 에러. sum() 메서드 지원 X
// 무한스트림은 limit같은 것으로 범위를 정해줘야 한다.
IntStreamintStream = new Random().ints(); // 무한 스트림
intStream.limit(5).forEach(System.out::println); // 5개의 요소만 출력한다.
// 처음부터 stream 크기를 정할수도 있다.
IntStream intStream = new Random().ints(5); // 크기가 5인 난수 스트림 반환
// 범위가 무한대이다.
Integer.MIN_VALUE <= ints() <= Integer.MAX_VALUE
Long.MIN_VALUE <= longs() <= Long.MAX_VALUE
0.0 <= doubles() < 1.0
// 무한 스트림
IntStream ints(int begin, int end)
LongStream longs(long begin, long end)
DoubleStream doubles(double begin, double end)
// 유한 스트림
IntStream ints(long streamSize, int begin, int end)
LongStream longs(long streamSize, long begin, long end)
DoubleStream doubles(long streamSize, double begin, double end)
IntStream intStream.range(int begin, int end)
IntStream intStream.rangeClosed(int begin, int end)
IntStream intStream.range(1, 5); // 1, 2, 3, 4
IntStream intStream.rangeClosed(1, 5) // 1, 2, 3, 4, 5
// UnaryOperator : 단항 연산자 - 입력값 1개, 출력값 1개
// 이전 요소에 종속적(무한 스트림)
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
// 이전 요소에 독립적(무한 스트림)
static <T> Stream<T> generate(Supplier<T> s)
// 0, 2, 4, 6, ... (무한 스트림)
Stream<Integer> evenStream = Stream.iterate(0, n -> n + 2);
// () -> Math.random() (무한 스트림)
Stream<Double> randomStream = Stream.generate(Math::random);
// 1, 1, 1, 1, 1, 1 ....(무한 스트림)
Stream<Integer> oneStream = Stream.generate(() -> 1);
(참고)
Stream<Path> Files.list(Path dir) // Path는 파일 또는 디렉토리
// 파일 내용을 라인 단위로 읽어서 Stream으로 만든다.
Stream<String> Files.lines(Path, path)
Stream<String> Files.lines(Path, path, Charset cs)
Stream<String> lines() // BufferedReader 클래스의 메서드
Stream emptyStream = Stream.empty(); // empty()는 빈 스트림을 생성해서 반환
long count = emptyStream.count(); // count의 값은 0