스트림은 데이터 소스(컬렉션, 배열 등)의 요소들을 시퀀셜(순차적) 또는 병렬적으로 처리할 수 있게 해줍니다.
1. Count
public class CountApp {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
long r2 = names.stream()
.filter(name -> name.length() > 3)
.count();
System.out.println(r2);
}
}
- .stream()
- 스트림을 생성합니다.
- .filter(name -> name.length() > 3)
- 이 부분은 중간 연산으로, 스트림의 요소 중 길이가 3보다 큰 문자열만을 통과시키는 필터를 적용합니다.
중간 연산은 많이 적을 수 있습니다.
- .count()
- 이 부분은 종단 연산으로, 필터링된 스트림의 모든 요소를 세고, 그 결과를 반환합니다.
2. Map
public class MapApp {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> newNames = names.stream()
.map(name -> name.toLowerCase())
.filter(name -> name.length() > 3)
.toList();
newNames.forEach(name -> System.out.println(name));
}
}
- .map(name -> name.toLowerCase())
- 중간 연산으로 각 이름을 소문자로 변환합니다.
- map은 스트림의 각 요소에 대해 주어진 함수를 적용합니다.
- .toList()
- 최종 연산으로, 변환되고 필터링된 스트림의 요소들을 새로운 리스트로 수집합니다.
3. Reduce
reduce 연산은 누적기(accumulator)를 사용하여 스트림의 모든 요소를 단일 결과로 합산, 곱셈, 연결 등의 연산을 수행할 수 있습니다.
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
int sum = nums.stream().reduce(0, (a, b) -> {
System.out.println("a: " + a);
System.out.println("b: " + b);
return a + b;
});
System.out.println("Sum: " + sum);
}
}
- .reduce(0, (a, b) -> a + b);
- 0은 초기값입니다.
- a는 이전에 계산된 누적 값입니다.
- b는 현재 스트림의 요소입니다.
- 연산 과정
- 0이 초기값이므로 a = 0 입니다.
- b는 컬렉션의 첫 번째 값으로 b = 1 입니다.
- a + b 값( 1 )이 다시 a가 됩니다.
- 컬렉션의 두 번째 값( 2 )이 b가 됩니다.
- a + b 값( 3 ) 이 가 됩니다.
- 컬렉션을 순환할 때 까지 반복됩니다.
- 출력 결과
a: 0
b: 1
a: 1
b: 2
a: 3
b: 3
a: 6
b: 4
Sum: 10
4. Sort
public class SortApp {
public static void main(String[] args) {
// sort, distinct
List<Integer> nums = Arrays.asList(5, 3, 1, 4, 2, 5);
nums.stream()
.sorted()
.distinct()
.forEach(integer -> System.out.println(integer));
}
}
- .sorted()
- 인수(Comparator)가 없을 경우 기본 정렬이 실행됩니다.
- 문자열: 일파벳 순서
- 정수, 실수: 숫자 크기 순서
- 매개변수(Parameter) → 함수를 정의할 때 사용되는 변수
- 인수(Argument): 함수를 호출할 때 전달하는 실제 값.
- .sorted(Comparator.naturalOrder())
- 기본 정렬 순서(알파벳 순서)를 사용하여 스트림의 요소를 정렬합니다.
- .distinct()
- 중복 값을 제거합니다.
5. Group
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Anna");
Map<Character, List<String>> groupedByFirstLetter = names.stream()
.collect(Collectors.groupingBy(name -> name.charAt(0)));
System.out.println(groupedByFirstLetter);
}
}
- .collect(Collectors.groupingBy(classifier))
- classifier → 요소들을 그룹화할 기준을 지정하는 함수
- var 키워드를 사용하면 변수의 타입을 명시하지 않고 컴파일러가 자동으로 추론하게 할 수 있습니다.
var groupedByFirstLetter = names.stream()
.collect(Collectors.groupingBy(name -> name.charAt(0)));
- 출력 결과
{A=[Alice, Anna], B=[Bob], C=[Charlie], D=[David]}
- groupData.get('A')
- groupData는 Map 이기 때문에 key로 value를 호출할 수 있습니다.
System.out.println(groupData.get('A'));
// 출력 결과 : [ALICE, ANNA]
Share article