Contents
코드데이터를 순차적 또는 병렬적으로 처리하기 위한 데이터 흐름(경로)
스트림을 물의 흐름이라 생각하기
- 구성 요소
- 데이터 소스(예: 컬렉션, 배열 등): 항상 특정 데이터 소스 기반 처리
- 중간 연산: 데이터 필터링, 매핑, 정렬 등 처리 흐름 변경 연산
- 최종 연산: 스트림을 소비하며 결과를 반환 (
collect,forEach,reduce등)
- 종류
- 순차 스트림: 하나의 스레드로 데이터 순차적 처리
- 병렬 스트림: 여러 스레드를 사용하여 데이터 병렬 처리
코드
1. count
import java.util.Arrays;
import java.util.List;
public class CountApp {
public static void main(String[] args) {
// count
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 뿌리고 중간 정산하고 다시 수집
// toList로 받아서 리턴타입 List<String>
List<String> r1 = names.stream()
.filter(name -> name.length() > 3)
.toList();
r1.forEach(s -> System.out.println(s)); // 람다 consumer
// count라서 리턴타입 long
long r2 = names.stream()
.filter(name -> name.length() > 3)
.count();
System.out.println(r2);
}
}
- 출력
Alice
Charlie
David
32. Map
import java.util.Arrays;
import java.util.List;
public class MapApp {
public static void main(String[] args) {
// map (가공) -Function. 받아서 돌려줌
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// List 글자 소문자 변환
// 던짐 > map은 무조건 순회 -수정해도 임시 공간에 남아있음 > toList 수집
List<String> newNames = names.stream()
.map(name -> name.toLowerCase())
.filter(name -> name.length() > 3)
.toList();
newNames.forEach(name -> System.out.println(name));
}
}
- 출력 :
alice
charlie
david3. reduce (조인)
5로 시작해, 스트림의 각 요소를 누적하여 합산
prev: 이전 결과 (누적값)
next: 현재 처리되는 요소
import java.util.Arrays;
import java.util.List;
public class ReduceApp {
public static void main(String[] args) {
// reduce (조인)
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
int sum = nums.stream()
.mapToInt(x -> x) // 모든 요소 int타입 리턴
.sum();
System.out.println("sum : " + sum);
// reduce 전까지 map 등 추가 가능
int sum2 = nums.stream()
.reduce(5, (prev, next) -> {
System.out.println("prev: " + prev);
System.out.println("next: " + next);
System.out.println("------------------");
return prev + next; // {}가 있으면 return이 반드시 있어야 한다
});
System.out.println(sum2);
}
}
4. sort, distinct
import java.util.Arrays;
import java.util.List;
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));
}
}1 2 3 4 5
5. group
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GroupApp {
public static void main(String[] args) {
// group
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Anna");
// Map<Character, List<String>> 기본 리턴타입 형태
// var로 간략 기재 가능
var groupData = names.stream()
.map(name -> name.toUpperCase()) // 모든 글자 대문자 변환
// 수집 -같은 항목끼리 구분함(map이라 보면 key값)
.collect(Collectors.groupingBy(s -> s.charAt(0)));
System.out.println(groupData);
System.out.println(groupData.get('A'));
}
}{A=[ALICE, ANNA], B=[BOB], C=[CHARLIE], D=[DAVID]}
[ALICE, ANNA]Share article