스트림의 생성
1. 컬렉션
Collection 인터페이스에는 stream() 메소드가 정의되어 있다.
따라서 Collection 인터페이스를 구현한 모든 클래스에서도 stream() 메소드로 스트림을 생성할 수 있다.
또한 parallelStream() 메소드를 사용해 병렬 처리가 가능한 스트림을 생성할 수 있다.
Stream클래스의 forEach는 스트림의 최종 연산으로
해당 스트림의 요소를 하나씩 소모해가며 순차적으로 요소에 접근하는 메소드이다.
ArrayList<String> al = new ArrayList<>();
al.add("Time");
al.add("to");
al.add("lazy");
Stream<String> s = al.stream();
s.forEach(e -> System.out.print(e+" "));
2. 배열
Arrays 클래스에는 다양한 형태의 stream() 메소드가 클래스 메소드가 정의되어 있다.
기본타입인 int, long, double 형을 저장할 수 있는 배열에 관한 스트림이 별도로 정의되어 있다.
(IntStream, LongStream, DoubleStream)
String[] sArr = {"Time0", "to1", "lazy2", "Time3", "to4", "lazy5"};
Stream<String> stream_1 = Arrays.stream(sArr);
Stream<String> stream_2 = Arrays.stream(sArr, 2, 4); //범위 설정 가능
stream_1.forEach(e -> System.out.print(e+" "));
stream_2.forEach(e -> System.out.print(e+" "));
int[] iArr = {1, 3, 5, 7, 9, 2, 4, 6, 8};
IntStream stream_3 = Arrays.stream(iArr);
stream_3.forEach(e -> System.out.print(e+" "));
3. 가변 매개변수
Stream 클래스의 of() 메소드를 사용해 가변 매개변수를 전달받아 생성 가능
Stream<Integer> iStream_1 = Stream.of(0, 1, 2, 3, 4, 5);
IntStream iStream_2 = IntStream.of(6, 7, 8, 9, 10);
iStream_1.forEach(e -> System.out.print(e+" "));
iStream_2.forEach(e -> System.out.print(e+" "));
4. 지정된 범위의 연속된 정수
IntStream과 LongStream 인터페이스에는 range(), rangeClosed()가 정의되어 있다.
range(from, to) 는 to를 포함하지 않는 스트림을 생성
rangeClosed(from, to) 는 to를 포함하는 스트림을 생성
IntStream.range(0, 10).forEach(System.out::print);
IntStream.rangeClosed(0, 10).forEach(System.out::print);
5. 특정 타입의 난수
Random 클래스의 ints(), longs(), doubles() 와 같은 메소드를 사용하면 난수로 이루어진 스트림을 생성할 수 있다.
이 메소드들은 매개변수를 전달받지 않을 경우 무한 스트림을 반환한다. limit() 를 사용해 크기를 제한해야 한다.
IntStream iStream_1 = new Random().ints(4);
IntStream iStream_2 = new Random().ints().limit(4);
6. 람다 표현식
람다식을 매개변수로 전달받아 해당 람다식에 의해 반환되는 값을 요소로 하는 무한 스트림을 생성하기 위해
Stream 클래스에는 iterate() 와 generate() 메소드가 정의되어 있다.
iterate() 메소드는 람다식에 사용하여 반환된 값을 다시 사용해 무한 스트림을 생성
generate() 메소드는 매개변수가 없는 람다식을 사용해 반환된 값으로 무한 스트림을 생성
Stream<Integer> iStream = Stream.iterate(2,n -> n+2).limit(10);
Stream<String> gStream = Stream.generate(()-> "Timetolazy").limit(3);
iStream.forEach(System.out::println);
gStream.forEach(System.out::println);
7. 파일
파일의 한 행을 요소로 하는 스트림을 생성하기 위해 java.nio.file.Files 클래스에는 lines() 메소드가 있다.
또한 java.io.BufferedReader() 클래스의 lines() 메소드를 사용하면 파일 뿐만 아니라 다른 입력으로부터 데이터를 행 단위로 읽을 수 있다.
Stream<String> fStream = Files.lines(Path path);
8. 빈 스트림
아무 요소도 가지지 않는 빈 스트림은 Stream 클래스의 empty() 메소드를 사용해 생성할 수 있다.
Stream<Object> eStream = Stream.empty();
내용 출처 : tcpschool.com/