🗓️ 메모
- 데이터 소스로부터 데이터를 읽기만 할 뿐, 변경하지 않는다.
- 최종 연산이 수행되기 전가지 중간 연산이 수행되지 않는다. (중간 연산 호출은 연산 지점, 작업 내용을 지정해줄 뿐)
스트림 소스 대상 -> 컬렉션, 배열, 임의의 수.. 다양하다.
배열 소스 스트림 생성 메서드는 static 메서드로 정의되어 있다.
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)
람다식을 매개변수로 받아서, 이 람다식에 의해 계산되는 값들을 요소로 하는 무한 스트림을 생성한다.
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
static <T> Stream<T> generate(Supplier<T> s)
// iterate()
Stream<Integer> evenStream = Stream.iterate(0, n->n+2);
// generate()
Stream<Double> randomStream = Stream.generate(Math::random);
Stream<Integer> oneStream = Stream.generate( () -> 1);
자르기
IntStream example = IntStream.rangeClosed(1,10);
example.skip(3).limit(5).forEach(System.out::print); // 45678
distinct() : 중복제거
filter() : 걸러내기
IntStream distinctStream = IntStream.of(1,2,2,3,3,3,3,4,5,5,6);
distinctStream.distinct().forEach(System.out::print); // 123456
IntStream filterStream = IntStream.rangeClosed(1,10);
filterStream.filter( index -> index % 2 == 0).forEach(System.out::print); // 246810
filterStream.filter( index -> index %2 != 0).filter( index -> index % 3 != 0.forEach(System.out::print); // 157
Stream<String> string = Stream.of("dd","aaa","CC","cc","b");
string.sorted().forEach(System.out::print); // CCaaabccdd
string.sorted(Comparator.reverseOrder()); // 역순 정렬
string.sorted(String.CASE_INSESITIVE_ORDER) // 대소문자 구분 없이
string.sorted(Comparator.comparing(String::length)) // 길이 순 정렬
// 정렬 조건 추가
instanceStream.sorted(Comparator.comparing(Instance::getInstance)
.thenComparing(Instance::getSum)
.thenComparing(Instance::getName)
.forEach(System.out::print);
스트림 요소에 저장된 값 중에서 원하는 필드 추출, 또는 특정 형태로 변환해야 할 때
map() 사용
- mapping? : 기존 값을 변경 x, 새로운 값을 생성해서 변환
// map()으로 Stream<File>을 Stream<String>으로 변환
Stream<File> fileStream = Stream.of(new File("Ex.java"), new File("Ex2.java"));
Stream<String> filenameStream = fileStream.map(File::getName);
filenameStream.forEach(System.out::println);
stream을 각 타입으로 변환시켜주는 메서드들 (자신 타입을 제외한 모든 스트림에서 동일하게 제공)
- mapToInt
- mapToLong
- mapToDouble
- mapToObj : 기본형 특화 스트림을 Stream으로 변환
정수를 문자열로 변환
public List<String> generateString(String readLine, int size) {
return IntStream.range(0, size)
.mapToObj( index -> readLine + index )
.collect(Collectors.toList());
}
기본형 특화 스트림 : IntStream
mapToObj : IntStream을 일반 스트림으로 변환