Java8 부터 도입된 기능으로, 람다를 활용해 컬렉션을 다루는 함수형 프로그래밍이다.
스트림은 데이터의 흐름을 말하고, 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해 원하는 결과를 필터링해 가공된 결과를 얻을 수 있다.
String[] array = { "apple", "banana", "orange" };
Stream<String> stream = Arrays.stream(array);
Arrays.asList()
를 사용해 배열로 변환 후 생성한다.
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();
Stream.Builder<Integer> builder = Stream.builder();
builder.add(1);
builder.add(2);
builder.add(3);
Stream<Integer> stream = builder.build();
stream.forEach(System.out::println);
조건에 맞는 요소만 필터링
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // [2, 4]
컬렉션의 요소를 다른 값으로 변환해 매핑
List<String> names = Arrays.asList("Daniel", "George", "Paul");
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(nameLengths); // [6, 6, 4]
컬렉션의 요소를 정렬
List<Integer> numbers = Arrays.asList(3, 7, 0, 2, 5);
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNumbers); // [0, 2, 3, 5, 7]
컬렉션의 최대 요소 개수를 제한
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
.limit(3)
.collect(Collectors.toList());
System.out.println(limitedNumbers); // [1, 2, 3]
몇 개의 요소를 건너뛸지 지정
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
.skip(2)
.collect(Collectors.toList());
System.out.println(skippedNumbers); // [3, 4, 5]
컬렉션의 모든 요소를 하나의 값으로 결합
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum); // 15
컬렉션의 요소를 원하는 형태의 요소로 수집
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Set<Integer> numberSet = numbers.stream()
.collect(Collectors.toSet());
System.out.println(numberSet); // [1, 2, 3, 4, 5]
컬렉션의 요소를 원하는 기준으로 그룹핑
List<String> names = Arrays.asList("Daniel", "George", "Paul");
Map<Character, List<String>> namesByFirstLetter = names.stream()
.collect(Collectors. groupingBy(name -> name.charAt(0)));
System.out.println(namesByFirstLetter); // {P=[Paul], D=[Daniel], G=[George]}
병렬 처리를 지원해 대용량 데이터 처리 가능
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.reduce(0, Integer::sum);
System.out.println(sum); // 15
스트림의 각 요소에 대해 동작을 수행하고, 주로 출력 시 사용한다.
List<String> strings = Arrays.asList("apple", "banana", "cherry");
strings.stream().forEach(System.out::println);
스트림에 포함된 요소의 개수 반환한다.
long count = strings.stream().count();
스트림의 요소를 수집해 최종 결과 반환한다.
(중간 연산의 filtering 예제 참고)
.collect(Collectors.toList())
자주 사용되는 수집기:
toList()
,toSet()
,toMap()
스트림 요소를 결합해 단일 값으로 줄인다.
모든 요소를 하나로 합치거나, 최댓값 또는 최솟값을 도출하는 작업에 사용된다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b);
Java stream 간단한 사용법 정리 - 고승조님의 블로그 - 인프런
[JAVA] Stream에 대한 사용법 및 내용 정리