inblog logo
|
silver
    기술정리

    [기술정리] stream과 stream API

    silver's avatar
    silver
    Jan 10, 2025
    [기술정리] stream과 stream API
    Contents
    stream : APP이 OS로 흐르는 흐름stream API흐름 StreamAPI을 사용할 수 있는 형식

    stream : APP이 OS로 흐르는 흐름

    • 자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룹니다.
    • 스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.
    • 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 합니다
     
    notion image

    stream API

    흐름

    notion image

    1. 던진다(스트림의 생성 - Creation)

    스트림은 컬렉션, 배열, I/O 채널 등에서 생성할 수 있다. 일반적으로 Collection 인터페이스의 stream() 메서드를 사용하여 스트림을 생성합니다.
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie","David","anna"); List<String> r1 = names.stream();

    2. 가공한다(중간 연산 - 스트림의 변환)

    중간 연산은 스트림을 변형하거나 필터링하는 작업을 수행한다. 여러 개의 중간 연산을 연결할 수 있다. (원래 가공하려면 임시 데이터 공간을 만들어야하지만 stream 임시 데이터 공간이 필요없다)
    주요 중간 연산
    메서드
    설명
    예시
    filter()
    조건에 맞는 요소만 필터링 ( 1. 삭제 2. 검색)
    stream.filter(s -> s.length() > 5)
    map()
    각 요소를 다른 값으로 매핑(가공)
    stream.map(s -> s.toUpperCase())
    flatMap()
    중첩된 스트림을 평면화
    stream.flatMap(Collection::stream)
    sorted()
    요소 정렬
    stream.sorted()
    distinct()
    중복 제거
    stream.distinct()
    limit()
    요소 개수 제한
    stream.limit(3)
    skip()
    처음 N개 요소 건너뛰기
    stream.skip(2)
    //Map<Character, List<String>>을 var로 작성해도 된다 //Map<Character, List<String>> groupData = names.stream() .map(name -> name.toUpperCase()) .collect(Collectors.groupingBy(s -> s.charAt(0))); .filter(name -> name.length() > 3) // . toList();

    3. 수집한다( 최종연산 - 스트림의 사용)

    최종 연산은 스트림의 결과를 생성하고, 스트림 처리 과정을 종료한다. 스트림을 소비하여 결과를 반환.
    주요 최종 연산
    메서드
    설명
    예시
    forEach()
    각 요소에 대해 작업 수행
    stream.forEach(System.out::println)
    collect()
    결과를 컬렉션으로 변환
    stream.collect(Collectors.toList()) → stream.toList() 으로 줄일 수 있다
    count()
    요소 개수 반환
    long count = stream.count()
    reduce()
    누적된 결과를 반환
    stream.reduce(0, Integer::sum)
    toArray()
    스트림 요소를 배열로 반환
    Object[] array = stream.toArray()
    findFirst()
    첫 번째 요소 반환
    Optional<String> first = stream.findFirst()
    anyMatch()
    조건에 만족하는 요소가 하나라도 있는지 확인
    boolean match = stream.anyMatch(s -> s.startsWith("a"))
    //List<String> newNames = names.stream() // .map(name -> name.toLowerCase()) // .filter(name -> name.length() > 3) .toList();
     
    💡

    StreamAPI을 사용할 수 있는 형식

    1. 컬렉션 - stream() 메서드를 사용하여 스트림으로 변환. : List: ArrayList, LinkedList 등 Set: HashSet, TreeSet 등 Queue: LinkedList, PriorityQueue 등
    1. 배열 - Arrays.stream(array) 메서드를 사용하여 스트림으로 변환.
    1. 파일 - Files.lines(Path path)를 사용하여 파일의 각 줄을 스트림으로 읽을 수 있다.
    1. 정수 범위 - IntStream.range(int startInclusive, int endExclusive)와 같은 메서드를 사용하여 특정 범위의 정수로 스트림을 생성할 수 있다.
    1. Stream.of(): Stream.of(T... values)를 사용하여 여러 개의 값을 직접 스트림으로 만들 수 있다.
    💡
    Stream정리
    list를 스트림에 던지려면 stream()
    배열을 스트림에 던지려면 Arrays.stream(numlist)
    String을 스트림에 던지려면 chars() → IntStream으로 던져진다
    .toList(); → 스트림의 요소 List로 변환
    .toArray(); → 스트림의 요소 배열로 변환
    💡
    Array를 스트림에 던지면 IntStream,DoubleStream,LongStream 형식으로 변환된다. → Array의 각 요소는 int,double,long타입
    List를 스트림에 던지면 Stream<T> 형식으로 변환된다. → List의 각 요소는 객체로 처리된다.
     
    Share article
    Contents
    stream : APP이 OS로 흐르는 흐름stream API흐름 StreamAPI을 사용할 수 있는 형식

    silver

    RSS·Powered by Inblog