프로그래밍 공부/Java

[Java] Stream API

1. Stream API란

스트림이란 자바 8 API에 새롭게 추가된 기능이다. JDK8부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하면서 Java를 이용해 함수형으로 프로그래밍할 수 있는 API 들을 제공해주고 있다. 그 중에서 Stream API는 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의해두었다. 여기서 데이터를 추상화하였다는 것은 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리할 수 있다는 것을 의미하며, 그에 따라 재사용성을 높일 수 있다.

출처 :  https://morioh.com/p/6b859b7a83e6

 

이번 로또 과제를 하면서 개인적으로 Stream API의 사용에 대해서 리뷰어분께 질문을 해봤고,대체러 Stream을 사용한다는 이야기를 들을 수 있어, 한번 정리하면서 공부를 진행해보려고 한다.

 

1단계에서의 질문
제이의 답변
간단한 예제!

위의 예제에서 나와있듯이, 스트림은

  1. 컬렉션으로부터 stream 얻기
  2. 중간 연산 (이번 경우에는 mapToLong, 여러개의 중간 연산을 할 수 있다.)을 통해 찾고자 하는 값 얻기
  3. 연산이 끝난 값을 원하는 자료구조로 만들어 획득하기

와 같은 구조를 생각하며 만든다면 더욱 쉽게 만들 수 있다. 

 

2. Stream API의 특징

 

  • 원본의 데이터를 변경하지 않는다.
  • 일회용이다.
  • 내부 반복으로 작업을 처리한다.

 

3. Stream API 활용하기

3.1. 중간연산

메서드명 처리 내용 ex)
filter 조건에 일치하는 요소만을 걸러낸다. .filter(p-> p.length()>5)
limit 원하는 개수만큼 고른다. .limit(5)
distinct 유니크한 요소만을 추출한다. (중복 요소 제거) .distinct()
map 요소들을 특정 값으로 변환 .map(p-> "[" + p + "]")
.map(Lotto::new)
sorted 정렬하기 .sorted() (오름차순 정렬)
.sorted(Comparator.reverseOrder()) (내림차순)
peek 특정 연산 수행 .peek(System.out::println)

 

 

3.1.1 조건 검사

stream의 요소들이 특정한 조건을 충족하는지 검사하기 위해서사용한다.

메서드명 처리 내용 ex)
anyMatch 하나라도 조건을 만족하는지 확인 .anyMacth(p -> p.equals(1))
allMatch 모든 요소가 조건을 만족하는지 확인 .allMacth(p -> p.equals(1))
nonMatch 모든 요소가 조건을 만족하지 않는지 확인 .nonMacth(p -> p.equals(1))

 

 

3.2. 종료연산

3.2.1 Collect와 함께 결과를 정리해서 추출하는 종료 작업

메서드명 처리 내용 예제
collect Collectors와 함께 객체 생성 .collect(아래에 있는 연산들)
toList List로 반환합니다. collect.(Collectors.toList())
toSet Set으로 반환합니다. collect.(Collectors.toSet())
joining 전체 요소를 하나의 문자열로 결합합니다. collect(Collectors.joining(","))
groupingBy 요소를 그룹으로 나눕니다. collect(Collectors.groupingBy(Student::getScore)

 

3.2.2 결과를 하나만 추출하는 종료 작업

메서드명 처리 내용 인수
findFirst 선두의 요소를 반환합니다. 없음
findAny 어떤 한 요소를 반환합니다. 없음
min 최솟값을 갖는 요소를 반환합니다. Comparator(인수가 Stream 대상 객체)
max 최댓값을 갖는 요소를 반환합니다. Comparator(인수가 Stream 대상 객체)

 

 

3.2.3 요소를 집계하여 결과의 수치를 반환하는 종료 작업

메서드명 처리 내용 반환 값
count 요소의 개수를 반환합니다. long
min 최소 요소를 반환합니다. OptionalInt/OptionalDouble/OptionalLong
max 최대 요소를 반환합니다. OptionalInt/OptionalDouble/OptionalLong
sum 합계 값을 반환합니다. OptionalInt/OptionalDouble/OptionalLong
average 평균값을 반환합니다. OptionalDouble

 

 

Reference

https://itprogramming119.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94-Stream-API-%EC%82%AC%EC%9A%A9-%EB%B0%8F-%EC%98%88%EC%A0%9C

https://tecoble.techcourse.co.kr/post/2021-05-23-stream-api-basic/

https://mangkyu.tistory.com/114

'프로그래밍 공부 > Java' 카테고리의 다른 글

[JAVA] JVM이란?  (0) 2022.03.13
[OOP] 객체지향 프로그래밍  (0) 2022.03.02
[Regex] 정규식이란?  (2) 2022.02.21
[JUnit5] 테스트 기초 알아보기  (0) 2022.02.17