Stream
스트림이란, 데이터 소스가 무엇이든 같은 방식으로 다룰 수 있게 추상화한 것이다.
특징
데이터 소스를 변경하지 않는다. Read only
재사용 불가
작업을 내부 반복으로 처리
반복문을 메서드 내부로 숨겨서 처리한다. forEach()void forEach(Consumer<? super T> acton) { Objects.requireNonNull(action); for(T t : src) { action.accept(T); } }
스트림 연산
중간 연산
스트림을 반환하는 연산. 연속해서 다른 연산 가능.최종 연산
반환하는 타입이 스트림이 아닌 연산.
중간연산
중간연산 | 설명 |
---|---|
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) | 스트림의 요소에 작업 수행 |
Stream<T> sorted() Stream<T>sorted(Comparator<T> comparator) |
스트림의 요소를 정렬 |
Stream<R> map(Function<T,R> mapper) DoubleStream mapToDouble(ToDoubleFunction<T> mapper) IntStream mapToInt(ToIntFunction<T> mppaer) 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) |
스트림의 요소를 변환한다. |
최종 연산
최종 연산 | 설명 |
---|---|
void forEach(Consumer <? super T> action) void forEachOrderd(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> findFirst() //첫번째 요소 |
요소 하나를 반환 |
boolean allMatch(Predicate<T> p) //모두 만족 boolean anyMatch(Predicate<T> p) //하나라도 만족 boolean noneMatch(Predicate<> p) //모두 만족하지 않음 |
주어진 조건을 모든 요소가 만족하는지, 만족하지 않는지 확인 |
Object[] toArray() A[] toArray(IntFunction<A[]> generator) |
스트림의 모든 요소를 배열로 반환 |
Optional<T> reduce(BinaryOperator<T> accumulator) T reduce(T identity, BinaryOperator<T> acculmulator) U reduce(U identity, BiFunction<U,T,U> accumulator, BinaryOperator combiner) |
스트림 요소를 하나씩 줄여가면서(reducing) 계산한다. |
R collect (Collect<T,A,R> collector) R collect (Supplier<R> supplier, Biconsumer<R,T> accumulator, BiConsumer<R,R> combiner) |
스트림의 요소를 수집한다. 요소를 그룹화하거나 분할한 결과를 컬렉션에 담아 반환할 때 사용. |
기본형을 다루는 스트림
- IntStream
- LongStream
- DoubleStream
오토박싱, 언박싱을 사용하지 않기 때문에 Stream<Interger>보다 효율적이다.
스트림 생성
컬렉션 스트림 생성
List<Integer> list = Arrays.asList(1,2,3,4,5); Stream<Integer> intStream = list.stream(); // Stream<T> Collection.stream()
배열으로 스트림 생성
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);
특정 범위의 정수를 요소로 가지는 스트림 생성
IntStream intStream = IntStream.range(1, 5); //1,2,3,4 IntStream intStream = IntStream.rangeClosed(1,5)// 1,2,3,4,5
난수를 요소로 가지는 스트림
IntStream - ints()
LongStream - longs()
DoubleStream - doubles()IntStream intStream = new Random().ints(); //무한 스트림 intStream.limit(5).forEach(i -> System.out.println(i)); //5개 출력 IntStream intStream = new Random().ints(5); //크기가 5인 난수 스트림 반환
중간 연산
자르기
Stream<T> skip(long n) //앞에서부터 n개 건너뛰기 Stream<T> limit(long maxSize) //maxSize이후 요소 잘라냄 IntStream intStream = IntStream.rangeClosed(1, 10); //1,2,3,4,5,6,7,8,9,10 //앞에 3개 자르고, 사이즈는 5로 한다. intStream.skip(3).limit(5).forEach(i->System.out.println(i)); //4,5,6,7,8
걸러내기
Stream<T> filter(Predicate<? super T> predicate) //조건에 맞지 않는 요소 제거 Stream<T> distinct(); //중복 제거
IntStream intStream = IntStream.of(1,2,2,3,3,3,4,5,5,6);
intStream.distinct()
.filter(i -> i%2==0)
.forEach(i -> System.out.println(i)); //2,4,6
'Java' 카테고리의 다른 글
Hassing & HashFunction (0) | 2020.09.10 |
---|---|
예외처리 (0) | 2020.09.10 |
람다Lambda (0) | 2020.09.09 |
제네릭 메서드Generic Method (0) | 2020.09.09 |
와일드카드 (0) | 2020.09.09 |