728x90
반응형
SMALL

스트림 API에는 기본형 특화 스트림이 존재한다. 자바에서는 IntStream, LongStream, DoubleStream 세 가지 형태를 제공하여 기본 자료형에 특화된 기능을 사용할 수 있게 한다.

 

예를 들어, IntStream은 합계 계산, 평균, 최솟값, 최댓값 등 정수와 관련된 연산을 좀 더 편리하게 제공하고, 오토박싱, 언박싱 비용을 줄여 성능도 향상시킬 수 있다.

 

기본형 특화 스트림의 종류

스트림 타입 대상 원시 타입 생성 예시
IntStream int IntStream.of(1, 2, 3),
IntStream.range(1, 10),
mapToInt(...)
LongStream long LongStream.of(10L, 20L),
LongStream.range(1, 10),
mapToLong(...)
DoubleStream double DoubleStream.of(3.14, 2.78),
DoubleStream.generate(Math::random),
mapToDouble(...)

 

기본형 특화 스트림의 숫자 범위 생성 기능

  • range(int startInclusive, int endExclusive): 시작값 이상, 끝 값 미만
  • rangeClosed(int startInclusive, int endInclusive): 시작값 이상, 끝 값 포함

 

주요 기능 및 메서드

기본형 특화 스트림은 합계, 평균 등 자주 사용하는 연산을 편리한 메서드로 제공한다. 또한 타입 변환과 박싱/언박싱 메서드도 제공하여 다른 스트림과 연계해 작업하기 수월하다.

 

참고로, 기본형 특화 스트림은 int, long, double 같은 숫자를 사용한다. 따라서 숫자 연산에 특화된 메서드를 제공할 수 있다.

 

메서드/기능 설명 예시
sum() 모든 요소의 합계를 구한다. int total = IntStream.of(1,2,3).sum();
average() 모든 요소의 평균을 구한다. double avg = IntStream.range(1, 5).average().getAsDouble();
summaryStatistics() 최솟값, 최댓값, 합계, 개수, 평균 등이 담긴 객체 변환 IntSummaryStatistics stats = IntStream.range(1, 5).summaryStatistics();
mapToLong(), mapToDouble(), mapToInt() 타입 변환: IntStream -> LongStream, DoubleStream LongStream ls = IntStream.of(1, 2).mapToLong(i -> i * 10L);
mapToObj() 객체 스트림으로 변환: 기본형 -> 참조형 Stream<String> s = IntStream.range(1, 5).mapToObj(i -> "No: " + i);
boxed() 기본형 특화 스트림을 박싱된 객체 스트림으로 변환 Stream<Integer> si = IntStream.range(1, 5).boxed();
sum(), min(), max(), count() 합계, 최소값, 최대값, 개수를 반환 long cnt = LongStream.of(1,2,3).count();

 

예시 코드

package stream.operation;

import java.util.IntSummaryStatistics;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
import java.util.stream.Stream;

public class PrimitiveStreamMain {
    public static void main(String[] args) {
        // 기본형 특화 스트림 (IntStream, LongStream, DoubleStream)
        IntStream intStream = IntStream.of(1, 2, 3, 4, 5);
        intStream.forEach(i -> System.out.print(i + " "));
        System.out.println();

        // 범위 생성 메서드
        IntStream range1 = IntStream.range(1, 6); // [1,2,3,4,5]
        IntStream range2 = IntStream.rangeClosed(1, 6); // [1,2,3,4,5,6]
        range1.forEach(i -> System.out.print(i + " "));
        System.out.println();
        range2.forEach(i -> System.out.print(i + " "));
        System.out.println();

        // 통계 관련 메서드
        int sum = IntStream.range(1, 6).sum();
        System.out.println("sum = " + sum);

        double avg = IntStream.range(1, 6).average().getAsDouble();
        System.out.println("avg = " + avg);

        IntSummaryStatistics stats = IntStream.range(1, 6).summaryStatistics();
        System.out.println("합계: " + stats.getSum());
        System.out.println("평균: " + stats.getAverage());
        System.out.println("최댓값: " + stats.getMax());
        System.out.println("최소값: " + stats.getMin());
        System.out.println("개수: " + stats.getCount());

        // 타입 변환 메서드
        LongStream longStream = IntStream.range(1, 5).asLongStream();
        DoubleStream doubleStream = IntStream.range(1, 5).asDoubleStream();

        Stream<Integer> boxed = IntStream.range(1, 5).boxed();

        // 기본형 특화 매핑
        LongStream mappedToLong = IntStream.range(1, 5).mapToLong(i -> i * 10L);
        DoubleStream mappedToDouble = IntStream.range(1, 5).mapToDouble(i -> i * 1.5);
        Stream<String> mappedToObj = IntStream.range(1, 5).mapToObj(i -> "Number " + i);

        // 객체 스트림 -> 기본형 특화 스트림으로 매핑
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
        IntStream intStream2 = integerStream.mapToInt(i -> i);
        int sum2 = intStream2.sum();
        System.out.println("sum2 = " + sum2);
    }
}

 

 

어디다가 써요?

  • 예를 들어, 기본 스트림을 사용하는데 전부 데이터가 숫자이고 이 합계를 구하고 싶다면 다음 코드가 가장 사용하기 좋은 예시가 된다.
// 객체 스트림 -> 기본형 특화 스트림으로 매핑
int newSum = Stream.of(1, 2, 3, 4, 5)
                .mapToInt(i -> i)
                .sum();
System.out.println("newSum = " + newSum);
  • 또 다른 예로, range(), rangeClosed() 같은 메서드를 사용하면 범위를 쉽게 다룰 수 있어 반복문 대신에 자주 사용된다.
  • summaryStatistics()를 이용하면 합계, 평균, 최소값, 최대값 등 통계 정보를 한번에 구할 수 있어 편리하다.

 

 

728x90
반응형
LIST

+ Recent posts