1. 스트림 중간 연산
Stream<T> distinct() : 중복을 제거
Stream<T> filter(Predicate<T> predicate) : 조건에 안 맞는 요소 제외
Stream<T> limit(long maxSize) : 스트림의 일부를 잘라낸다.
Stream<T> skip(long n) : 스트림의 일부를 건너뛴다.
Stream<T> peek(Consumer<T> action) : 스트림의 요소에 작업수행 => forEach와 비슷하고 작업 중간에 넣어서 결과를 확인할 때
Stream<T> sorted()
Stream<T> sorted(Comparator<T> comparator) : 스트림의 요소를 이때 comparator기준으로 정렬한다.
Stream<R> map(Function<T, R> mapper)
DoubleStream mapToDouble(ToDoubleFuntion<T> mapper)
IntStream mapToInt(ToIntFunction<T> mapper)
LongStream mapToLong(ToLongFunction<T> mapper)
Stream<R> flatmap(Function<T, Stream <R>> mapper)
DoubleStream flatmapToDouble(Function<T, DoubleStream> m)
IntStream flatmapToInt(Function<T, IntStream> m)
LongStream flatmapToLong(Function<T, LongStream> m)
- // 이 중간연산의 핵심은 map & flatMap을 얼마나 잘 쓰냐이다.
1) skip(), limit()
- skip : 앞에서부터 n개 건너뛰기
- linig : maxSize 이후의 요소는 잘라냄
Stream<T> skip(long n)
Stream<T> limit(long maxSize)
IntStream intStream = IntStream.rangeClosed(1, 10);
intStream.skip(3).limit(5).forEach(System.out::print);
2) filter(), distinct()
- filter : 조건에 맞지 않는 요소 제거
- distinct : 중복제거
Stream<T> filter(Predicate<? super T> predicate)
Stream<T> distinct()
IntStream intStream = IntStream.rangeClosed(1, 10);
intStream.filter(i->i%2==0).forEach(System.out::print);
intStream.filter(i->i%2!=0 && i%3!=0).forEach(System.out::print);
intStream.filter(i->i%2!=0).filter(i->i%3!=0).forEach(System.out::print);
IntStream intStream = IntStream.of(1,2,2,3,3,3,4,5,5,6)'
intStream.distinct().forEach(System.out::pring);
3) sorted()
- sorted : 스트림요소의 기본정렬하거나 지정된 Comparator로 정렬함
Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)
strStream.sorted()
strStream.sorted(Comparator.naturalOrder())
strStream.sorted((s1, s2) -> s1.compareTo(s2));
strStream.sorted(String::compareTo);
CCaaabccdd
strStream.sorted(Comparator.reverseOrder())
strStream.sorted(Comparator.<String>naturalOrder().reversed())
ddccbaaaCC
strStream.sorted(String.CASE_INSENSITIVE_ORDER)
aaabCCccdd
strStream.sorted(String.CASE_INSENSITIVE_ORDER.reversed())
ddCCccbaaa
strStream.sorted(Comparator.comparing(String::length))
strStream.sorted(Comparator.comparingInt(String::length))
bddCCccaaa
strStream.sorted(Comparator.comparing(String::length).reversed())
aaaddCCccb
4) Comparator의 comparing(), thenComparing()
- Comparator의 comparing()으로 정렬기준을 제공
comparing(Function<T, U> keyExtractor)
comparing(Function<T, U> keyExtractor, Comparator<U> keyComparator)
studentStream.sorted(Comparator.comparing(Student::getBan))
.forEach(System.out::pringln);
studentSteam.sorted(Comparator.comparing((Student s)->s.getBan).reversed()
.thenComparing(Comparator.naturalOrder()).reversed())
.forEach(System.out::println);
- 추가정렬 기준을 제공할 때는 thenComparing()을 사용
thenComparing(Comparator<T> other)
thenComparing(Function<T, U> keyExtractor)
thenComparing(Function<T, U> keyExtractor, Comparator<U> keyComp)
studentStream.sorted(Comparator.comparing(Studeng::getBen))
.thenComparing(Student::getTotalScore)
.thenComparing(Student::getName)
.forEach(System.out::pringln);
5) map()
Stream<R> map(Function<? super T,? extends R> mapper)
Stream<File> fileStream = Stream.of(new File("Ex1.java"), new File("Ex1") new File("Ex1.bak"), new File("Ex2.java"), new File("Ex1.txt"));
Stream<String> filenameStream = fileStream.map(File::getName);
filenameStream.forEach(System.out::println);
- 예시2 파일 스트림에서 파일 확장자(대문자)를 중복없이 뽑아내기
fileStream.map(File::getName)
.filter(s->s.indexOf('.') != -1)
.map(s->s.substring(s.indexOf('.)+1))
.map(String::toUpperCase)
.distinct()
.forEach(System.out::pring);
6) peak()
Stream<T> peek(Consumer<? super T> action)
void forEach(Consumer<? super T> action)
fileStream.map(File::getName)
.filter(s -> s.indexOf('.') != -1)
.peek(s -> System.out.pringf("filename=%s%n", s))
.map(s -> s.substring(s.indexOf('.')+1))
.peek(s -> Systemout.pringf("extension=%s%n", s))
.forEach(System.out::println);
7) flatMap()
Stream<String []> strArrStrm = Stream.of(new String[]{"abc", "def", "ghi"},
new String[]{"ABC", "GHI", "JKLMN"});
- 예시 : 만약 그냥
.map()
을 쓴다면 스트림의 스트림이 되어버린다.
Stream<Stream<String>> strStrStream = strArrStrm.map(Arrays::Stream);
- 예시 : 만약 당신이 여러개의 문자열 배열을 하나의 문자열 배열로 바꾸길 원한다면
.flatMap()
을 쓰면 된다.
Stream<String> strStrStream = strArrStrm.flatMap(Arrays::Stream);
2. 스트림 최종 연산
void forEach(Consumer<? super T> action)
void forEachOrdered(Consumer<? super T> action) : 병렬스트림으로 처리할 때 스트림 요소의 순서를 유지하는 기능
long count() : 스트림 요소의 개수 반환
Optional<T> max(Comparator<? super T> comparator) : 정렬 기준으로 스트림의 최대값을 반환
Optional<T> min(Comparator<? super T> comparator) : 정렬 기준으로 스트림의 최솟값을 반환
Optional<T> findAny() : 병렬처리할 때 아무거나 하나
Optional<T> finFirst() : 직렬처리할 때 첫 번째 요소
boolean allMatch(Predicate<T> p) : 모두 만족하는지
boolean anyMatch(Predicate<T> p) : 하나라도 만족하는지
boolean noneMatch(Predicate<T> p) : 모두 만족하지 않는지
Object[] toArray()
A[] toArray(IntFunction<A[]> generator) : 이걸 사용하면 특정 type의 객체로 변환하여 담을 수 있다.
Optional<T> reduce(BinaryOperator<T> accumulator)
T reduce(T identity, BinaryOperator<T> accumulator)
U reduce(U identity, BiFunction<U,T,U> accumulator, BinaryOperator<U> combiner)
R collect(Collector<T, A, R> collector)
R collect(Supplier<R> supplier. BiConsumer<R,T> accumulator, BiConsumer<R, R> combiner)
- 요 최종연산의 핵심은 reduce와 collect이다.