[자바1.8기술]스트림 Stream API

gov's avatar
Nov 20, 2024
[자바1.8기술]스트림 Stream API
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 3

2. 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 david

3. 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); } }
notion image

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

goho