스트림 생성
다양한 방식으로 스트림을 생성할 수 있다.
빈 스트림 생성
Stream::empty
는 빈 스트림을 생성한다.
Stream<String> emptyStream = Stream.empty();
매개변수를 사용한 생성
Stream::of
는 매개변수 목록을 받고 Arrays.stream
을 반환하여 스트림을 생성한다.
Stream<String> cityNamesStream = Stream.of("Seoul", "Incheon",
"Ulsan", "Daegu", "Gwangju", "Busan");
null이 될 수도 있는 객체를 스트림화
Java 9 이상에서 추가된 Stream.ofNullable
은 매개변수의 값이 null이 아니면 스트림을 생성한다.
null인 경우 Stream.empty
를 반환하여 빈 스트림을 생성한다.
Map<String, List<String>> map = new HashMap<>();
map.put("metropolitan", Arrays.asList("Seoul", "Incheon"));
map.put("Jeolla", Arrays.asList("Gwangju"));
map.put("Gyeongsang", Arrays.asList("Ulsan", "Daegu", "Busan"));
Stream<String> cityNamesStream =
Stream.ofNullable(map.get("metropolitan").stream().collect(Collectors.joining()));
cityNamesStream.forEach(System.out::println); // SeoulIncheon
cityNamesStream = Stream.ofNullable(map.get("Gangwon").stream().collect(Collectors.joining()));
cityNamesStream.forEach(System.out::println); // 빈 스트림
배열으로부터 스트림 생성
Arrays.stream
은 배열을 매개변수로 받아서 스트림을 생성한다.
String[] cities = { "Seoul", "Incheon", "Gwangju", "Ulsan", "Daegu", "Busan" };
Stream<String> stream = Arrays.stream(cities);
stream.forEach(System.out::println);
파일으로부터 스트림 생성
Files::lines
는 파일을 읽어 행을 하나의 String
으로 간주하는 스트림을 생성한다.
try {
Stream<String> fileStream = Files.lines(Paths.get("test.txt"), Charset.defaultCharset());
fileStream.flatMap(line -> Arrays.stream(line.split(" ")));
fileStream.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
함수형 인터페이스로 스트림 생성
Stream::iterate
와 Stream::generate
는 함수형 인터페이스를 매개변수로 받아 무한 스트림을 생성할 수 있다.
iterate
iterate는 for문과 비슷한 구조를 갖는다.
매개변수는 초기값, Predicate<T>
, UnaryOperator<T>
를 사용한다.
Predicate<T>
는 선택사항이기 때문에 없어도 동작한다.
Stream.iterate(0, n -> n + 1) // 초기값은 0, n은 1씩 증가
.limit(5)
.forEach(System.out::println);
Stream.iterate(0, n -> n < 5, n -> n + 1) // 위와 같으나 n < 5 조건 추가
.forEach(System.out::println);
generate
매개변수로 Supplier<T>
만 받기 때문에 스트림 생성 시 별도의 인수가 필요없는 경우에만 사용한다.
// 로또 번호를 생성해보자.
Random random = new Random();
IntStream.generate(() -> random.nextInt(45) + 1) // IntStream 역시 생성할 수 있다.
.limit(6)
.forEach(System.out::println);
'Java' 카테고리의 다른 글
안전하게 코딩하는 좋은 습관, 일급 콜렉션 (1) | 2020.11.08 |
---|---|
멱등성과 테스트 (0) | 2020.11.08 |
Java Stream (5) 기본 자료형 스트림 (0) | 2020.07.22 |
Java Stream (4) 스트림 주요 메소드 (0) | 2020.07.17 |
Java Stream (3) 스트림의 개념 (0) | 2020.07.15 |