백엔드/Java의 정석

TIL 정리_27

ran4 2022. 3. 14. 22:47

스트림 만들기

 

컬렉션

컬렉션의 최고조상인 Collection에 stream()이 정의되어 있다

stream()은 컬렉션을 소스(source)로 하는 스트림을 반환한다

Stream<T> Collection.stream()

예) List로부터 스트림을 생성하는 코드

List<Integer> list = Arrays.asList(1,2,3,4,5);

Stream<Integer> intStream = list.stream();

 

배열

배열을 소스로 하는 스트림을 생성하는 메서드는 Stream과 Arrays에 static 메서드로 정의되어 있다

Stream<T> Stream.of(T[])

문자열 스트림

Stream<String> strStream = Stream.of(new String[]{ });

 

특정 범위의 정수

IntStream과 LongStream은 지정된 범위의 연속된 정수를 스트림으로 생성해서 반환하는

range()와 rangeClosed()가 있다

IntStream IntStream.range(int begin, int end)

IntStream IntStream.rangeClosed(int begin, int end)

 

람다식 iterate(), generate()

Stream 클래스의 iterate()와 generate()는 람다식을 매개변수로 받아서

이 람다식에 의해 계산되는 값들을 요소로 하는 무한 스트림을 생성한다

static<T> Stream<T> iterate(T seed, UnaryOperator<T> f) //이전요소에 종속적

static<T> Stream<T> generate(Supplier<T> s) //이전요소에 독립적

->위 스트림은 기본형 스트림 타입의 참조변수로 다룰 수 없다

mapToInt()와 같은 메서드로 변환이 필요하다

 

파일

java.nio.file.Files는 파일을 다루는데 유용한 메서드를 제공한다

list()는 지정된 디렉토리(dir)에 있는 파일의 목록을 소스로 하는 스트림을 생성하고 반환한다

Stream<path> Files.list(Path dir) //path 파일 또는 디렉토리

 

빈 스트림

요소가 하나도 없는 비어있는 스트림을 생성할 수 있다 

연산 결과가 없을 때, null보다 빈 스트림이 낫다

Stream emptyStream = Stream.empty();

long count = emptyStream.count();

**count()는 스트림 요소의 개수를 반환한다

 

두 스트림의 연결

Stream의 static 메서드인 concat()을 사용하면 두 스트림을 하나로 연결할 수 있다

두 스트림의 요소가 같아야 한다

Stream<String> strs3 = Stream.concat(strs1, strs2);

 

스트림의 연산 :

* 스트림이 제공하는 기능 -> 중간 연산과 최종 연산

* 중간연산 : 연산결과가 스트림, 반복적 사용 가능

* 최종연산 : 연산결과가 스트림이 아닌 연산, 단 한번만 적용가능(스트림의 요소를 소모)

 

스트림의 중간연산

 

스트림 일부 자르기 skip() limit()

Stream<T> skip(long n) // (n)개의 요소를 뛰어넘는다

Stream<T> limit(long maxSize) // 요소를 (maxSize)개로 제한한다

 

스트림의 요소 걸러내기 filter(), distinct()

distinct()는 스트림에서 중복된 요소를 제거하고,

filter()는 주어진 조건(Predicate)에 맞지 않는 요소를 걸러낸다

Stream<T> filter(Predicate <? super T> predicate) //조건에 맞지 않는 요소 제거

Stream<T> distinct() //중복제거

 

정렬 sorted()

스트림을 정렬할 때는 sorted()를 사용한다

Stream<T> sorted()

Stream<T> sorted(Comparator<? super T> comparator)

 

변환 map()

스트림 요소에 저장된 값 중에서 원하는 필드만 뽑거나 특정 형태로 변환해야 할 때 사용한다

매개변수로 T타입을 R타입으로 변환해서 반환하는 함수를 지정해야 한다

Stream<R> map(Function<? super T, ? extends R) mapper)

 

조회 peek()

연산과 연산사이에 올바르게 처리되었는지 확인할 때 사용한다

forEach()와 달리 여러번 사용해도 된다

 

mapToInt(), mapToLong(), mapToDouble()

map()은 연산결과로 Stream<T>타입의 스트림을 반환

-> 스트림의 요소를 숫자로 반환하는 경우 기본형으로 변환하는 것이 더 유용함

DoubleStream mapToDouble()

IntStream mapToInt()

LongStream mapToLong()

 

->그러나 변환하는 것보다 IntStream타입을 생성해서 사용하는 것이 더 효율적이다

count()만 다루는 Stream<T>와 달리 기본형 스트림은 숫자를 다루는데 편리한 메서드를 제공

int sum() : 스트림 모든 요소의 총합
OptionalDouble average() : sum()/(double)count()
OptionalInt max() : 스트림의 요소 중 제일 큰 값
OptionalInt min() : 스트림의 요소 중 제일 작은 값

예시) long totalScore = scoreStream.sum()

이 메서드들은 최종연산이기 때문에 호출 후에 스트림이 닫힌다

두 메서드를 동시 호출할 때 summaryStatistics()라는 메서드를 사용한다

 

IntStream -> Stream<T> 변환 : mapToObj() 사용

IntStream -> Stream<Integer> 변환 : boxed() 사용

 

mapToInt()와 함께 자주 사용되는 메서드로는 Integer parseInt() 혹은

valueOf()가 있다

Stream<String> -> IntStream 변환 시, mapToInt(Integer::parseInt)

Stream<Integer> -> IntStream 변환 시, mapToInt(Integer::intValue)

 

flatMap() 

Stream<T[]>를 Stream<T>로 변환

스트림의 요소나 map()의 연산결과가 배열인 경우에

Stream<T[]>대신 Stream<T>로 다룰 경우 map()대신 flatMap()을 사용한다

 

스트림의 스트림을 스트림으로 변환

Stream<String[]> strArrStrm = Stream.of(new String[] {}, new String[] {});

Stream<Stream<String> strStrStrm = strArrStrm.map(Arrays::stream);

 

여러개의 문자열을 하나인 것처럼 사용한다

Stream<String> strStrStrm = strArrStrm.flatMap(Arrays::stream); =Arrays.stream(T[])

 

'백엔드 > Java의 정석' 카테고리의 다른 글

TIL 정리_29  (0) 2022.03.16
TIL 정리_28  (0) 2022.03.15
TIL 정리_26  (0) 2022.03.13
TIL 정리_25  (0) 2022.03.12
TIL 정리_24  (0) 2022.03.11