Java 기초 정리 - 스트림 (Stream)

Zyoon·2025년 4월 15일

Java 기초정리

목록 보기
15/24
post-thumbnail

💡Stream의 사용이유와 사용법


Stream


📘 반복문 없이 컬렉션 데이터를 필터링, 변환, 집계할 수 있는 기능

  1. 스트림이란?
  • 데이터를 효율적으로 처리할 수 있는 흐름
  • 컬렉션(리스트, 배열 등) 데이터를 흐름(스트림) 형태로 다룸
  • 선언형 스타일로 가독성이 좋음
  • 원본 컬렉션/배열을 건드리지 않고 처리 결과를 새로 생성

  1. 기본 구조
컬렉션.stream()  
    .중간연산()  
    .중간연산()  
    .최종연산();

  1. 함수 종류
  • 중간 연산
    //조건에 맞는 요소만 통과
    filter(s. -> s.length() > 3)
    
    //요소를 다른 형태로 변환
    map(num -> num + 3)
    
    //요소를 여러 스트림으로 펼쳐서 합침
    fiatMap(s -> Arrays.stream(s.split("")))
    
    //중복제거
    distinct()
    
    //정렬
    sorted() or sorted(Comparator.reverseOrder()) //오름차순, 내림차순
    
    //앞에서 n개만 꺼냄
    limit(n)
    
    //앞에서 n개를 건너뜀
    skip(n)
  • 최종 연산
    //각 요소에 대해 작업 수행
    forEach(value -> System.out.println(value.name))
    
    //결과를 모아서 컬렉션으로 반환
    collect(Collectors.toList())
    
    //배열로 변환
    toArray(Integer[]::new) // new Integer[size];
    
    //요소 개수 반환
    count()
    
    //하나라도 조건 만족하는지 검사
    anyMatch(s -> s.equals("a"))
    
    //모두가 조건 만족하는지 검사
    allMatch(s -> s.length() > 0)
    
    //아무것도 조건을 만족하지 않는지 검사
    noneMatch(s -> s.isEmpty())
    
    //첫 번재 요소 반환(Optional)
    findFirst()
    
    //아무 요소나 하나 반환(Optional)
    findAny()
  • 숫자 전용 Stream 함수
    //모든 숫자 합계
    sum()
    
    //평균 반환 (OptionalDouble)
    average()
    
    //최댓값, 최솟값 반환 (OptionalInt)
    max(), min()
    
    //값이 있으면 반환, 없으면 x 반환
    orElse(x)
    
    //값이 없으면 람다 호출로 기본값 설정
    orElseGet(() -> "default")
    
    //값이 없으면 예외 발생
    orElseThrow()

  1. 코드 예시
// 중간 연산을 함께 사용하는 방법(filter() + map())
// 요구사항 : 리스트에서 짝수를 찾아서 * 10

//리스트 생성
List<Integer> arrayList = Arrays.asList(1, 2, 3, 4, 5);

//Stream 으로 데이터 처리
List<Integer> ret = arrayList.stream() // 1. 데이터 흐름 준비 (1,2,3,4,5)
        .filter(num -> num % 2 == 0) // 2. 중간 연산 등록 (짝수 찾기)
        .map(num -> num * 10) // 3. 중간 연산 등록(* 10)
        .collect(Collectors.toList());
//데이터 출력
System.out.println("ret :: "+ ret);

//ret :: [20, 40]
  • filter() 와 map() 을 활용하는 경우가 자주 쓰임

  1. for 문과 비교
//리스트에 각 요소 * 10 처리

//리스트 생성 - 선언과 동시에 add 가능 (new 생성자 필요없음)
List<Integer> arrayList = Arrays.asList(1, 2, 3, 4, 5);

//for문 스타일
List<Integer> ret1 = new ArrayList<>();
for(Integer num : arrayList){
    Integer multipliedNum = num * 10;
    ret1.add(multipliedNum);
}

// stream 선언형 스타일
List<Integer> ret2 = arrayList.stream() // 1. 데이터 흐름 준비
        .map(num -> num * 10) // 2. 중간 연산 등록 (함수)
        .collect(Collectors.toList()); // 3. 최종 연산 단계 (반환값)
  • stream 형 - 코드 가독성 / 간결함
  • for 문 - 빠른 처리 속도
  • 작거나 중간 크기 데이터는 성능 차이가 없지만 데이터가 많아질수록 for 문이 속도면에서 유리
  • 각 상황에 맞게 유연하게 사용 가능
profile
기어 올라가는 개발

0개의 댓글