스트림

임성혁·2022년 9월 4일

자바 기초

목록 보기
32/32

1. 정의

  • 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Stream5 {
    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Stream<Integer> intStream = list.stream();
        Stream<String> strStream = Stream.of(new String[]{"a", "b", "c"});
        Stream<Integer> evenStream = Stream.iterate(0, n -> n + 2);
        Stream<Double> randomSTream = Stream.generate(Math::random);

    }
}
  • 스트림이 제공하는 기능 - 중간 연산과 최종 연산
    • 중간 연산 : 연산 결과가 스트림인 연산. (반복적 적용가능)
    • 최종 연산 : 연산 결과가 스트림이 아닌 연산 (한 번만 사용 가능)
    stream.distinct().limit(5).sorted().forEach(System.out::println)
    중간연산:istinct().limit(5).sorted()
    최종연산:forEach(System.out::println)

2. 특징

  • 스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경 안 함
  • 스트림은 iterator처럼 일회용 (필요하면 다시 생성)
  • 최종 연산 전까지 중간 연산이 수행되지 않음
  • 기본형 스트림 : IntStream, LongStream, DoubleStream
    • 오토박싱 & 언박싱 비효율 제거 == Stream〈Integer〉 대신 IntStream 사용
    • 숫자와 관련된 유용한 메서드를 Stream〈T〉 보다 더 많이 제공

3. 생성

  • 컬렉션으로부터 스트림 생성하기
  • 배열로 스트림 생성하기
  • 특정 범위의 정수를 요소로 갖는 스트림 생성
  • 람다식을 소스로 하는 스트림 생성
Stream<Integer> intStream = list.stream()
Stream<String> strStream = Stream.of("a", "b", "c")
IntStream intStream = IntStream.range(1, 5)
Stream<Integer> evenStream = Stream.iterate(0, n -> n + 2)

4. 중간연산

  • 스트림 자르기
    • skip() : 앞에서부터 n개 건너뛰기
    • limit() : maxSize
    IntStream intStream = IntStream.rangeClosed(1, 10); // 12345678910
    intStream.skip(3).limit(5).forEach(System.out::println; // 45678
  • 스트림 요소 걸러내기
    • filter() : 조건에 맞지 않는 요소 제거
    • distinct() : 중복제거
  • 스트림 정렬하기
    • sorted()
  • 스트림 요소 변환
    • map()
    • 스트림을 기본 스트림으로 변환 : mapToInt(), mapToLong(), mapToDouble()
  • 스트림 엿보기
    • peek() : peek(s -> sout(s))

5. 최종연산

  • 스트림의 모든 요소에 지정된 작업 수행
    • forEach()
  • 스트림을 배열로 전환
    • toArray()
  • 조건 검사
    • allMatch()
    • anyMatch()
    • noneMatch()
  • 조건에 일치하는 요소 찾기
    • findFirst()
    • findAny()
    Optional<Student> result = StudentStream.filter(s -> s.score < 50).findAny();
  • Optional〈T〉
    • T 타입 객체의 래퍼 클래스
    • Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)
    • null 에러 막아줌
    • get(), orElse() // T타입의 객체 가져오기, 없으면 대체하기
  • 스트림에 대한 통계 정보 제공
    • count()
    • sum()
    • average()
    • max()
    • min()

6. Collect(), Collector

  • collect()는 collector를 매개 변수로 하는 스트림의 최종 연산
  • toList(), toSet(), toMap()
List<String> names = StudentStream.map(Student::getName).collect(Collector.toList())
profile
열정

0개의 댓글