빙응의 공부 블로그
[JAVA]함수형 프로그래밍 - Stream API 본문
📝Stream API에 대한 이해
JAVA는 객체지향 언어(명령형 프로그래밍)이기 때문에 기본적으로 함수형 프로그래밍이 불가능하다.
하지만 JDK8부터 함수형 프로그래밍을 위한 Stream API, 람다식, 함수형 인터페이스 등을 지원하고 있다.
Stream API
- 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의
예를 들어보자 우리는 리스트에서 짝수 값을 찾아 제곱하여 출력하는 것을 만든다고 하자.
일반 코드
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 짝수만 필터링하여 제곱 값 출력
List<Integer> result = new ArrayList<>();
for (int n : numbers) {
if (n % 2 == 0) {
result.add(n * n);
}
}
// 결과 출력
for (int square : result) {
System.out.println(square);
}
Stream API 사용
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 짝수만 필터링하여 제곱 값 출력
numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.forEach(System.out::println);
함수형 프로그래밍은 가독성을 높이고 유지보수를 용이하게 해준다.
JAVA 8의 Stream API를 사용하면 위 코드처럼 더 간결해지고 이해하기 쉽게 해준다.
📝Stream API의 특징
원본의 데이터를 변경하지 않는다.
Stream API는 원본의 데이터를 조회하여 별도의 Stream을 생성한다. 그렇기 때문에 원본의 데이터로부터 읽기만 할 뿐, 모든 작업은 별도의 Stream 요소로 처리한다.
Stream은 일회용이다.
Stream API는 일회용이기 때문에 종단 스트림(terminal stream)을 사용하면 재사용이 불가능하다.
종단 스트림을 사용시 Stream을 다시 생성해주어야 한다.
List<String> words = Arrays.asList("Java", "Stream", "API");
// 스트림 생성
Stream<String> wordStream = words.stream();
// 중간 연산: 길이가 4 이상인 단어만 필터링
Stream<String> filteredStream = wordStream.filter(word -> word.length() >= 4);
// 최종 연산: 각 단어 출력
filteredStream.forEach(System.out::println);
// 다시 같은 스트림을 사용하려고 하면 IllegalStateException이 발생
filteredStream.forEach(System.out::println);
내부 반복으로 작업을 처리한다.
Stream을 이용하면 코드가 간결해지는 이유는 내부 반복에 있다.
기존 반복문을 사용하기 위해선 for이나 while 같은 문법을 사용해야 했지만, Stream은 반복 문법을 내부에 숨기고 있다.
//내부 반복으로 작업을 처리한다.
filteredStream.forEach(System.out::println);
컬렉션 처리에 효과적이다.
Stream API는 기존의 컬렉션을 다루는 메서드와 함께 사용할 수 있다. 컬렉션 데이터를 처리할 때 연산을 적용하여
결과를 가공할 수 있다.
병렬 처리 지원
Stream API는 내부적으로 병렬 처리를 지원한다.
'parallel()' 메서드를 이용하여 스트림을 병렬 스트림으로 변환할 수 있다.
📝정리
Java 8에 추가된 Stream API는 함수형 프로그래밍을 지원하는 도구로, 데이터 처리를 추상화하고 가독성을 높여준다.
실무에서 자주 사용하는 만큼 잘 사용하는 법을 알아두는게 좋다.
✔참조 사이트
'JAVA' 카테고리의 다른 글
[JAVA]함수형 프로그래밍 - Stream API 사용법 (1) | 2023.11.30 |
---|---|
[JAVA]함수형 프로그래밍 - 람다식(Lambda Expression) (2) | 2023.11.29 |
[JAVA]함수형 프로그래밍 (0) | 2023.11.29 |
[JAVA] Optional (0) | 2023.11.28 |
[JAVA] Collection - 사용 방법 (0) | 2023.11.28 |