자바 Stream [Java]

Pturt·2025년 2월 4일

Java

목록 보기
2/2

스트림 Stream

stream : 데이터의 흐름. 람다를 사용하여 컬렉션에 저장된 요소들을 하나씩 순회하면서 처리할 수 있는 패턴

* 람다 함수 : 익명 함수. 함수를 더 단순하게 표현하는 방법.
람다 함수를 통해 불필요한 반복문을 삭제하고 식을 더욱 단순하게 표현할 수 있음. *

for/foreach 대신에 배열을 순회할 때 사용된다.

배열, 컬렉션의 함수를 스트림 식과 조합하여 원하는 결과를 가공해낼 수 있다.

스트림의 특징

- 원본 배열의 데이터를 변경하지 않음.
- 멀티 쓰레드를 사용하여 병렬처리(하나의 작업을 나눠서 동시에 진행)가 가능하다.
- 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조인 컬렉션과 반대로 스트림은 요청할 때만 계산을 실행한다.

스트림의 사용 구조는 3가지로 나뉜다.
1. 생성
2. 가공
3. 결과 (최종 연산)

1. 스트림 생성

배열과 컬렉션 등을 사용해 스트림을 생성.

배열 스트림 : Array.stream

Stream<String> stream = Arrays.stream(배열명)

컬렉션 스트림 : 컬렉션 인터페이스에 Stream 메소드를 사용

public interface Collection<E> extends Iterable<E> {
  default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
  } 

람다식 스트림

Stream.generate(), Stream.iterate()

Stream<String> generateStream = Stream.generate().limit(5);
Stream<Integer> iterateStream = Stream.iterate(0, n -> n+2).limit(5);

2. 스트림 연산

Filtering

stream.filter()

스트림 내의 요소들을 검사, 필터링한다. if 문과 유사 기능

Stream<String> stream = list.stream().filter(list -> list.contains("a"));

Mapping

stream.map()

스트림 내의 요소들에 함수를 적용해 특정 값으로 변환한다.
값의 변환을 위해 람다를 인자로 받는다.

Stream<String> stream = list.stream().map(String::toUpperCase);
  • flatMap : 중첩 구조를 제거하고 단일 컬렉션으로 만든다. (플래트닝)

Sorting

stream.sorted()
스트림 내의 값들을 정렬한다. 다른 정렬과 마찬가지로 Comparator를 사용한다.

list.stream().sorted() // 인자 없이 실행시 오름차순 정렬

Iterating

stream.peek()

스트림 내의 요소들 각각을 대상으로 특정 연산을 수행. 연산을 수행할 뿐 결과에 영향을 미치지 않음.

list.stream().peek(System.out::println);

기타

Stream<String> stream = list.stream()
		.distinct() // 중복 제거
        .limit(max) // 크기 제한
        .skip(n) // 앞에서부터 n개를 생략

3. 최종 연산

Calculating

스트림 내의 요소들로 기본 연산을 수행

Stream<Integer> stream = list.stream()
			.count()
            .sum() 
            .min() 
            .max() 
            .average()

Collecting

stream.collect(Collector.함수)
스트림 내의 요소들을 원하는 자료형으로 변환

list.stream().
		.collect(Collectors.tolist()); // 리스트로 변환
list.stream().
		.collect(Collectors.joining) // 작업 결과를 하나의 스트링으로 이어 붙임
list.stream().
		.collect(Collectors.groupintBy(Person::getAge)); // 결과를 그룹 지어서 Map으로 변환

--> 최신 버전에서는 Collector를 사용하지 않고 stream().tolist()로 자료형 변경이 가능해짐

Matching

스트림 내에 특정 조건을 만족하는 요소가 있는지 체크 후 결과 반환.
anyMatch - 하나라도 만족 / allMatch - 모두 만족 / noneMatch - 모두 불만족

list.stream()
	.antMatch(members-> members.contain("w"));

참고 자료
Java 스트림 Stream (1) 총정리

profile
애송이 개발자

0개의 댓글