자바 Stream API , stream() , 자바 반복문
Stream API란?
Java의 Stream API는 List, Map, Set과 같은 컬렉션 이나 배열과 같은 데이터 소스를 처리하기 위한 선언적 프로그래밍이다. 이를 통해서 데이터의 순차적, 병렬적 처리를 수행하기 쉽다.
여기서 선언적 프로그래밍이라고 하면! 무엇 중심의 코드로 데이터 처리 의도를 간단하게 표현하고, 메서드 체이닝을 통해 작업 단계를 명확히 나열하고 마지막으로 명령형 코드처럼 루프를 돌면서 상태를 변경하지 않는 프로그래밍 스타일이다.
(참고 : 2025.01.09 - [개발 이모저모] - 명령형 프로그래밍, 선언적 프로그래밍이란?)
Stream API의 특징
- for/while 과 같은 반목문 대신 stream()을 사용하여 간결한 코드를 작성할 수 있다.
- 메서드 체이닝을 하여 처리단계를 구성한다.
- 원본 데이터를 변경하지 않고 새 값을 반환한다.
- filter, map같이 중간 연산은 최종 연산(ex : findFirst, collect)이 호출 될 때까지 실행되지 않는다.
예제 소스
List<String> names = List.of("Alice", "Bob", "Charlie");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A")) // 이름이 'A'로 시작하는 것만 필터링
.map(String::toUpperCase) // 이름을 대문자로 변환
.collect(Collectors.toList()); // 결과를 리스트로 수집
System.out.println(filteredNames);
// 결과 : [ALICE]
소스 설명을 해보면,
stream()
컬렉션에서 스트림 객체를 생성하는 메서드이다. Stream객체를 생성하면 데이터에 대해 필터링, 매핑, 집계 등 작업을 할 수 있다.
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
Stream<Integer> numberStream = numbers.stream(); // 리스트를 스트림으로 변환
filter()
stream내 데이터를 조건에 따라 필터링 한다. 조건에 맞는 요소들만 stream에 남기고 조건에 맞지 않은 요소는 제외시킨다.
위의 소스에서는 조건을 'A'로 시작하는 것에 대해 필터링 한것이다.
stream.filter()는 입력값을 받아 true / false를 반환하는 함수형 인터페이스이다. (조건에 맞는 데이터로 이루어진 새로운 stream)
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(num -> num % 2 == 0) // 짝수만 필터링
.collect(Collectors.toList()); // 결과를 리스트로 수집
System.out.println(evenNumbers);
// 결과 : [2, 4]
map()
stream내 요소를 다른 형식으로 변환(매핑)하는데 사용된다. 각 요소를 입력받아 변환작업을 해준다.
위의 소스에서는 요소들을 모두 대문자로 변환한 것이다.
stream.map()은 입력값을 받아 다른 값으로 변환해주는 함수형 인터페이스로 변환된 데이터로 이루어진 새로운 stream이다.
List<String> names = List.of("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
.map(String::length) // 각 이름의 길이를 매핑
.collect(Collectors.toList());
System.out.println(nameLengths);
// 결과 : [5, 3, 7]
collect()
stream 데이터를 최종적으로 원하는 형태로 수집할 때 사용한다. Collectors클래스를 사용하여 다양하게 collect할 수 있다.
위의 소스에서는 Collectors.toList()로 하여 stream데이터를 list로 변환하여 반환한 것이다.
for,while / Stream API 차이점에 궁금하다면?
2025.01.11 - [개발 이모저모] - for/while 반복문 VS streamAPI 뭐가 더 좋을까?