프로그래밍/자바(JAVA)

Stream API

aSpring 2023. 12. 6. 19:31
728x90
728x90

Stream API

 

JAVA : 객체지향 언어

- 기본적으로 함수형 프로그래밍이 불가능

- 하지만, JDK8부터 Stream API, 람다식, 함수형 인터페이스 등을 지원 -> JAVA를 이용해 함수형으로 프로그래밍 할 수 있는 API들을 제공

 

Stream API

- 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의

   ㄴ 데이터의 종류와 상관 없이 같은 방식으로 데이터를 처리할 수 있다는 것 -> 재사용성을 높일 수 있음

- Stream API를 이용하지 않고 배열이나 리스트의 데이터를 정렬시켜 출력하면 원본의 데이터가 직접 정렬됨

- Stream API를 이용하면 원본 데이터에 변경 없이 가능(원본 데이터가 아닌 별도의 Stream을 생성하고 복사된 데이터를 정렬하여 출력)

 

Stream API 특징

1. 원본의 데이터를 변경하지 않는다.

2. 일회용이다.

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

 


1. 원본의 데이터를 변경하지 않는다.

Stream API는 원본의 데이터를 조회 -> 원본 데이터가 아닌 별도의 요소들로 Stream 생성

=> 원본의 데이터를 읽기만 할 뿐, 정렬/필터링 등의 작업은 별도의 Stream 요소들에서 처리됨

 

2. Stream은 일회용이다.

Stream API는 일회용이므로 한번 사용이 끝나면 재사용이 불가능하며 Stream이 또 필요한 경우 다시 생성해주어야 함

=> 닫힌 Stream을 다시 사용한다면 IllegalStateException이 발생하게 됨

 

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

내부 반복 -> 코드가 간결해지는 이유 중 하나

=> for, while 등과 같은 반복 문법을 메소드 내부에 숨기고 있기 때문에 보다 간결한 코드의 작성이 가능

 

Stream API의 3단계

1. 생성하기

- Stream 객체 생성

- 배열, 컬렉션, 임의의 수, 파일 등 거의 모든 것을 가지고 스트림 생성 가능

- 닫히면 다시 생성해야 함

 

2. 가공하기

- 원본의 데이터를 별도의 데이터로 가공하기 위한 중간 연산

- 연산 결과를 Stream으로 다시 반환 -> 연속해서 중간 연산을 이어갈 수 있음

- 필요한 만큼 중간 연산을 연결하여 사용할 수 있음

 

3. 결과만들기

- 가공된 데이터로부터 원하는 결과를 만들기 위한 최종 연산

- Stream의 요소들을 소모하면서 연산이 수행되기 때문에 1번만 처리가능함

 

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
	.stream() // 생성
    .filter(s -> s.startWith("a")) // 가공 (필터링) 
    .sorted()					   // 가공 (정렬)	  -> 중간 연산
    .count(); // 결과 만들기 - 남아있는 요소의 개수를 최종적으로 반환

- 중간 연산이 세미콜론 없이 여러 번 연결 -> 연산 파이프라인

- forEach와 같이 값을 반환하지 않는 최종 연산도 존재

 

 

참고

https://mangkyu.tistory.com/112

 

728x90
728x90