[기술 정리] 3. Stream API

KangHo Lee's avatar
Nov 21, 2024
[기술 정리] 3. Stream API
💡
스트림은 데이터 소스(컬렉션, 배열 등)의 요소들을 시퀀셜(순차적) 또는 병렬적으로 처리할 수 있게 해줍니다.

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는 현재 스트림의 요소입니다.
  • 연산 과정
      1. 0이 초기값이므로 a = 0 입니다.
      1. b는 컬렉션의 첫 번째 값으로 b = 1 입니다.
      1. a + b 값( 1 )이 다시 a가 됩니다.
      1. 컬렉션의 두 번째 값( 2 )이 b가 됩니다.
      1. a + b 값( 3 ) 이 가 됩니다.
      1. 컬렉션을 순환할 때 까지 반복됩니다.
  • 출력 결과
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

devleekangho