스트림
- 데이터의 흐름을 단순하고 효율적으로 처리하도록 도와준다. → 데이터를 다루는 방법을 간단하게 만들어주는 도와준다.
- 데이터를 필터링하거나 변형하는 등의 작업을 쉽게 할 수 있다.
- 컬렉션, 배열 등의 데이터를 함수형 프로그래밍 방식으로 처리할 수 있게 하여, 병렬처리와 최적화가 용이하다는 장점이 있다.
List<String> list = Arrays.asList("Kim", "Park", "Lee", "Choi", "Chee"); // (1) List<String> sublist = list.stream() // (2) 스트림 생성 .filter(s -> s.startsWith("C")) // (3) 스트림 처리 .sortde() // (4) 스트림 처리 .collect(Collectors.toList()); // (5) 결과 생성 System.out.println(sublist); // (6) 결과 출력
위의 코드 설명
(1) 문자열들을 ArrayList에 저장한다.
(2) ArrayList의 stream() 메서드를 호출하여 스트림을 생성한다.
→ 이후에 ArrayList에 저장된 데이터들이 하나씩 스트림으로 공급된다.
(3) 첫 번째 처리 스트림인 filter() 메서드를 “C”로 시작하는 문자열만 통과 시킨다.
(4) sorted() 메서드는 문자열을 정렬한다.
(5) collect() 메서드는 결과를 모아서 리스트로 만든다.
(6) 결과가 저장된 리스트를 출력한다.
스트림의 장점
- 컬렉션에 대한 일반적인 처리 패턴은 SQL과 유사하여 개발자가 루프와 변수를 사용하여 처리 할 필요가 없다.
- 큰 컬렉션을 효율적으로 처리하려면 멀티 코어 아키텍처를 활용 해야 하는데 스트림 API는 다중 스레드 코드를 한 줄도 작성하지 않고 다중 코어 아키텍처를 활용 할 수 있다.
스트림 연산
- 데이터를 처리하기 위한 각종 연산들을 제공한다.
- 제공하는 연산들은 3가지로 분류 할 수 있다
제공하는 연산 3가지!
1. 생성 단계 : 스트림 객체를 생성하는 단계이다. 배열이나 컬렉션을 가지고 스트림을 생성할 수 있다.
2. 처리 단계 : 입력 데이터를 출력 데이터로 가공하는 연산이다.
3. 종말 단계 : 처리된 데이터를 모아서 결과를 만드는 연산이다.
스트림의 기본 사용
- 생성 단계 → 스트림은 배열이나 컬렉션에서 만든다.
// 배열 String[] arr = {"Kim", "Lee", "Park"}; Stream<String> s2 = Arrays.stream(arr); // 컬렉션 List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream();
- 필터링 (filter()) → 조건에 맞는 데이터만 통과 시키는 연산
List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream().filter(s->s.contains("P")); // Park 만 통과 한다.
- 매핑 연산 (map()) → 기존의 데이터를 변형하여서 새로운 데이터로 생성하는 연산
// 람다식 List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream().map(s->s.toUpperCase()); // 모두 대문자로 변경 // 메서드 참조 Stream<String> s1 = list.stream().map(String::toUpperCase());
- 정렬 연산 (sorted()) → 데이터들을 어떤 기준에 따라 정렬하는 연산
Stream<String> s1 = list.stream().sorted(Comparator.reverseOrder()); // 내림차순 정렬
- 축소 연산 (reduce()) → 요소들을 결합하여서 하나의 값으로 만드는 연산 (축소 연산)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); int sum = numbers.stream().reduce(0, (a, b) -> a + b); // 변수의 초기 값과 리스트의 모든 요소 결합
- 종말 단계 → 입력 데이터들을 모아서 결과를 생성 (최대값, 최소값, 합계, 평균값, 개수 등)
int sum = IntStream.of(20, 10, 30, 90, 60) // 정수를 스트림으로 생성해주는 문장이다. .sum(); // 합계를 계산하여 반환한다. int count = IntStream.of(20, 10, 30, 90, 60) // 정수를 스트림으로 생성해주는 문장이다. .count(); // 합계를 계산하여 반환한다. // 스트림 처리의 결과를 컬렉션으로 만들어주는 메서드 IntStream.of(20, 10, 30, 90, 60).sorted().collect(Collectors.toList());
- forEach() 연산 → 스트림의 각 항목에 대하여 어떤 특정한 연산을 수행할 수 있다.
List<String> list = Arrays.asList("Kim", "Lee", "Park"); Stream<String> s1 = list.stream().forEach(System.out::println); // 스트림을 지나가는 모든 데이터 화면 출력
Share article