Language/Java
스트림1
Jinn
2024. 1. 7. 20:25
다양한 데이터 소스(컬렉션, 배열)를 표준화된 방법으로 다루기 위한 것.
스트림 사용법
- 스트림 생성
- 중간 연산(n번): 연산결과가 스트림
- 최종 연산(1번): 연산결과가 스트림이 아님(스트림의 요소를 소모함)
//예시
//스트림.중간연산1.중간연산2.중간연산3.최종연산
stream.distinct().limit(5).sorted().forEach(System.out::println)
스트림 특징
- 원본 데이터를 읽기만 가능하고 변경하지 않는다.(Read Only)
- 일회용이다. (필요하면 다시 스트림을 생성해야 한다.)
- 지연된 연산을 한다. (최종 연산 전까지 중간 연산이 수행되지 않는다.)
- 기본형 스트림(IntStream 등)을 제공하여 오토박싱&언박싱 비효율을 없앤다.
- 스트림 작업을 병렬로 처리할 수 있다.
스트림 생성
- 컬렉션 ⇨ 스트림
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> intStream = list.stream(); // 리스트를 스트림으로 변환
intStream.forEach(System.out::print); // 스트림의 모든 요소 출력 (끝나면 스트림이 닫힘)
- 배열 ⇨ 스트림
// 객체 배열 -> 스트림
Stream<String> strStream = Stream.of("a", "b", "c");
Stream<String> strStream = Stream.of(new String[] {"a", "b", "c"});
Stream<String> strStream = Arrays.stream(new String[] {"a", "b", "c"});
Stream<String> strStream = Arrays.stream(new String[] {"a", "b", "c"}, 0, 3); // 0~2번 인덱스까지
// 기본형 배열 -> 스트림
IntStream intStream = IntStream.of(1, 2, 3, 4);
IntStream intStream = IntStream.of(new int[] {1, 2, 3, 4});
IntStream intStream = Arrays.stream(new int[] {1, 2, 3, 4});
IntStream intStream = Arrays.stream(new int[] {1, 2, 3, 4}, 0, 3);
- 난수 스트림
// 무한 스트림
IntStream intStream = new Random().ints();
intStream.limit(5).forEach(System.out::println); // 무한 스트림은 limit으로 잘라서 사용
// 유한 스트림
IntStream intStream = new Random().ints(5); // 스트림 사이즈
IntStream intStream = new Random().ints(1, 10); // 난수의 범위
IntStream intStream = new Random().ints(5, 1, 10); // 사이즈 + 범위
- 특정 범위 값 스트림
IntStream intStream = IntStream.range(1, 5); // 1, 2, 3, 4
IntStream intStream = IntStream.rangeClosed(1, 5); // 1, 2, 3, 4, 5
- 람다식으로 스트림 생성
// iterate() 사용. 이전 요소를 seed로 사용해서 다음 요소를 계산
Stream<Integer> evenStream = Stream.iterate(0, n->n+2); // 무한 스트림
// generate() 사용. seed 없음
Stream<Double> randomStream = Stream.generate(Math::random); // 무한 스트림
//Stream<Double> randomStream = Stream.generate(()->Math.random());
- 파일로 스트림 생성
Stream<Path> Files.list(Path dir)
Stream<String> Files.lines(Path path)
- 빈 스트림
Stream emptyStream = Stream.empty();