Java Stream API 알아보기

hyun·2023년 1월 24일
1
post-thumbnail

java8부터 나온 기능이고 코딩 테스트 공부할 때 보니 다른 사람들이 stream api로 문제를 해결한 것도 많이 보였다. 일하면서 잘 사용하지 않은 것 같아 이 참에 공부해서 업무단에서도 활용해보고자 한다!

그럼 시작해보자~!~!~!



개념

Java Stream API는 java8부터 추가된 기능으로 데이터 집합을 읽는 객체이다. stream 내부에 데이터를 추상화하고 처리하는 데 자주 사용하는 함수들이 정의되어 있다.



특징

1. 데이터 소스를 변경하지 않는다.

stream의 중요한 개념은 '데이터를 읽는다'는 것이다. 즉 stream api에서는 원본 데이터를 변경하지 않는다. 원본 데이터를 조회하여 별도로 stream을 생성하고 정렬, 필터링의 작업들도 원본 데이터가 아닌 stream에서 처리한다.

2. 일회용 객체이다

stream은 일회용이기 때문에 재사용이 불가하다. 컴파일 단계에서는 오류로 나타나지 않으나 "java.lang.IllegalStateException: stream has already been operated upon or closed" 런타임에러가 발생한다.

3. 내부적으로 반복 작업을 처리한다.

stream 내부에 for, while과 같은 역할을 하는 함수(forEach 함수)이 정의되어 있어 stream api를 통해 코드를 간결하게 나타낼 수 있다.



자주 사용하는 stream 함수

filter

// 조건에 맞는 요소만을 담은 스트림으로 반환한다.
Stream<T> filter(Predicate<? super T> predicate)
//예 1)
int intArr[] = {1,2,3,4,5};

// intArr에서 값이 2이상인 요소들만 System.out.println을 이용하여 콘솔에 출력한다.
Arrays.stream(intArr).filter(num -> num > 2).forEach(System.out::println);

=> 콘솔창에 출력된 내용
3
4
5
//예 2)

String strArr[] = {"hi", "hello", "hippo", "pencil"};

// strArr에서 hi로 시작하는 문자열만 System.out.println을 이용하여 콘솔에 출력한다.
Arrays.stream(strArr).filter(e -> e.startsWith("hi")).forEach(System.out::println);

=> 콘솔창에 출력된 내용
hi
hippo

map

// 주어진 함수를 이 스트림의 요소에 적용한 결과로 구성된 스트림으로 리턴
<R> Stream<R> map(Function<? super T,? extends R> mapper)

sorted

// stream내 주어진 요소를 정순으로 정렬한 stream을 리턴한다.
Stream<T> sorted()

//예)
List<Integer> numList = new ArrayList<>();

numList.add(1);
numList.add(5);
numList.add(63);
numList.add(72);
numList.add(234);
numList.add(35);

numList.stream().sorted().forEach(System.out::println);

=> 콘솔창에 출력된 내용
1
5
35
63
72
234
// stream내 주어진 Comparator를 기준으로 정렬한 stream을 리턴한다.
Stream<T> sorted(Comparator<? super T> comparator)

// 예)
List<Integer> numList = new ArrayList<>();

numList.add(1);
numList.add(5);
numList.add(63);
numList.add(72);
numList.add(234);
numList.add(35);

numList.stream().sorted(Collections.reverseOrder()).forEach(System.out::println);

=> 콘솔창에 출력된 내용
234
72
63
35
5
1

forEach

// 이 스트림의 각 요소에 대한 동작을 한다.
void forEach(Consumer<? super T> action)
//예)
int numArr[] ={1,2,3};
Arrays.stream(numArr).forEach(e -> System.out.println(e + 1));

=> 콘솔창에 출력된 내용
2
3
4

toArray

// 이 스트림의 요소를 담은 배열을 리턴한다.
Object[] toArray()

//제공된 생성자를 사용하여 반환된 배열과 분할된 실행 또는 크기 조정에 필요할 수 있는 추가 배열을 할당하여 이 스트림의 요소를 포함하는 배열을 반환
<A> A[] toArray(IntFunction<A[]> generator)

// 예)
Plant[] flower = plant.stream()
                     .filter(p -> p.getType() == FLOWER)
                     .toArray(Plant[]::new);




참고 자료(링크 내 내용들이 이해하기 쉽게 되어 있으니 한 번 읽어보는 걸 추천!)

https://pamyferret.tistory.com/43
https://mangkyu.tistory.com/112
https://mine-it-record.tistory.com/477
https://devjem.tistory.com/41
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

profile
크리스마스 캐럴을 좋아하는 사람!

0개의 댓글