-
Java: 람다와 스트림의 기본적인 이해와 사용법 - 2각종 학습 요약/Java 2022. 5. 19. 12:20
Java: 람다(lambda)와 스트림(Stream)의 기본적인 이해와 사용법 - 2
이전 글에서 람다의 아주 기초적인 형태나 개념은 익혔을 거라 생각하고, 이번 글에서는 주로 스트림을 활용하는 방법에 대해 알아보려고 한다. 주요 메서드 소개가 주가 될 것 같다.
아래 글을 따라가며 순차적으로 스트림을 열고 - 스트림 중간에 특정연산을 거쳐서 - 스트림의 결과값을 가지고 뭔가 산출해내면 된다(아래 예시처럼). 메서드 하나하나씩 써보자..!/* 예시 */ psvm { sout(func()); } int func() { return Intstream.range(1,5) /* '스트림 열기' 파트에서 하나 고르고(param은 설명보고 적당히 넣자) */ .skip(3) /* '스트림 사용 2'에서 하나 고르고 */ .sum(); /* '스트림 사용 3'에서 하나 고르면 완성 */ }
스트림 열기 - 1. 각종 자료형에서 스트림 열기
- 배열 :
Arrays.stream(배열);
- 컬렉션 프레임워크 :
컬렉션.stream();
- 원시형 스트림1 - int :
IntStream.range(n번째 요소, m번째 슬라이싱), IntStream.rangeClosed(시작요소, 끝요소)
// 원시 스트림은 오토박싱이 일어나지 않는다. - 원시형 스트림2 - Long :
LongStream.range(), LongStream.rangeClosed()
// IntStream과 동일. - String 스트림1 -
Pattern.compile(정규식).splitAsStream("원문자열");
// 원문자열을 정규식으로 split해서 스트림 반환한다. - String 스트림2 -
"문자열".chars();
// 원문자열을 캐릭터 단위의 IntStream으로 반환한다. - of :
Stream.of(소스);
- 스트림 빌더 :
Stream.<T>builder().add("~~").build();
- 스트림 제너레이너 :
Stream.generate().limit(10);
// generate()는 반드시 사이즈를 명시해줘야한다. - iterate :
Stream.iterate(람다).limit(10);
// 람다를 통해 초기값부터 표현된 출력값을 반복 생성하여 스트림으로 반환. generate()와 마찬가지로 사이즈를 꼭 명시해야 한다.
스트림 사용 - 2. 중간 연산 메서드
구분 이름 설명 1 filter(bool형 람다식) 필터링. 대개 람다식을 이용해서 특정 조건에 부합하는지 체크한다. 부합하는 요소만 들어있는 스트림이 반환된다. 2 map(람다식) 매핑. 요소에 특정 처리를 해서 돌려준다. 더블로 반환하는 mapToDouble(), 인트로 반환하는 mapToInt(), 롱으로 반환하는 mapToLong()이나, 2차원 배열을 위한 flatMap()이 있다. 3 skip(long n) 말 그대로 요소를 n번 스킵. 4 limit(long maxSize) 앞부터 maxSize까지, 반환할 스트림의 사이즈를 제한한다. 5 sorted(), sorted(Comparator c) 소스가 Comparable을 구현하는 타입이거나, 파라미터로 Comparator를 넘겨주어 정렬을 할 수 있다. 6 distinct() 말 그대로 중복을 제거한다. 7 concat(스트림1, 스트림2) 스트림1 뒤에 스트림2를 붙여 반환한다. API Docs 원문은 여기를 참고하자(반환타입이 Stream이나 void인 녀석들이 중간 연산 메서드들이고, 특정 타입 혹은 'R'인 녀석들은 최종연산 메서드니 참고하자).
스트림 사용 - 3. 최종 연산 메서드
지금까지도 많았는데 인간적으로 좀 많다... 한번 쓱 보고 다 외울 수 있는 사람이 아니라면 다 외우려고 하지 말자.
그나마 이름이 직관적이라 유추해서 사용할 수도 있을 것 같다.
위와 같이 작성하다가 현타가 와서 방식을 바꾼다.
이름만 나열해도 찾아서 쓸 수 있을 것 같아서 이름 위주로 기록하되, 설명이 필요한 부분만 따로 메모한다.- 기본 집계:
count()
,sum()
,min()
,max()
,average()
reduce(람다식), reduce(기본값, 람다식)
: 커스텀 집계값을 위해 사용한다. 두개의 매개값을 받아 연산 후 리턴하는 람다를 이용한다. 기본값을 설정할 수 있다. 기본값을 설정하지 않는 경우는 get() 메서드를 사용해 결과값을 얻는다. 병렬스트림의 결과값을 합칠 수도 있는데, 일단은 신경쓰지 말자.collect(요소)
: 요소를 수집하거나(컬렉션으로 반환) 그룹핑의 결과를 집계한다(map결과를 reduce). 사용자 정의 컨테이너에 수집할 수도 있고, 병렬처리도 가능한데, 이 역시 일단은 신경쓰지 말자. collect는 글을 정리하는 시점에서도 잘 이해가 되지 않아서, 넣을까 말까 고민을 많이 하다가 넣는다. 컬렉션 관련해서 기본 제공되는 collect요소 메서드(Collectors.toList(), toSet(), toMap()) 위주로 사용을 익혀두자.
reduce()와 collect()는 설명은 복잡하지만 실제로 컬렉션과 함께 쓰기에는 간편하게 메서드가 제공되고 있으니 꼭 실습을 해서 익숙해지도록 하자.
추가: 실제로 써보면서 연습하려니 API Docs 링크들도 추가해 놓는 것이 정신건강에 좋겠다는 것을 깨달았다. 실습에 필요한 좋은 자료가 있다면 계속 추가해나가야겠다.
* IntStream
* LongStream
* DoubleStream
* Optional
* OptionalInt
* OptionalLong
* OptionalDouble'각종 학습 요약 > Java' 카테고리의 다른 글
Java: JDBC API 기본 개념 이해 (0) 2022.06.30 Java: 입출력(I/O) 스트림(Stream) 기초 개념 (0) 2022.05.20 Java: 람다와 스트림의 기본적인 이해와 사용법 - 1 (0) 2022.05.19 Java: Enum 클래스의 기본적인 이해 (0) 2022.05.19 Java: 내부 클래스(Inner Class)의 기본적인 이해 (4) 2022.05.18 Java: 컬렉션 프레임워크(Collection Framework) 개요 (0) 2022.05.17 - 배열 :