Post

Java Primitive 유형 스트림

1. 원시 스트림

스트림은 주로 기본 유형이 아닌 객체 컬렉션과 함께 작동한다.

가장 많이 사용되는 세 가지 기본 유형인 int, long 및 double을 사용하는 방법을 제공하기 위해 표준 라이브러리에는 세 가지 기본 유형에 특화된 구현인 IntStream, LongStream 및 DoubleStream이 포함되어 있다.

기본 스트림은 주로 박싱 오버헤드와 다른 기본 형식에 대한 특수 스트림을 생성하는 것이 많은 경우에 그다지 유용하지 않기 때문에 제한된다.

2. 산술 연산

min, max, sum 및 average와 같이 자주 사용되는 산술 연산에 대한 몇 가지 방법이 있다.

1
2
3
4
int[] integers = new int[] {20, 98, 12, 7, 35};
int min = Arrays.stream(integers)
  .min()
  .getAsInt(); // returns 7

위의 코드 조각을 단계별로 살펴본다.

java.util.Arrays.stream(int[])을 사용하여 IntStream을 생성한 다음 min() 메서드를 사용하여 가장 낮은 정수를 java.util.OptionalInt로 가져오고 마지막으로 getAsInt()를 호출하여 int 값을 가져왔다.

IntStream을 생성하는 또 다른 방법은 IntStream.of(int…)를 사용하는 것이다. max() 메소드는 가장 큰 정수를 반환한다.

1
2
3
int max = IntStream.of(20, 98, 12, 7, 35)
  .max()
  .getAsInt(); // returns 98

다음으로 정수의 합을 얻으려면 sum() 메소드를 호출하기만 하면 되고 getAsInt()는 이미 결과를 int 값 으로 반환하므로 사용할 필요가 없다.

1
int sum = IntStream.of(20, 98, 12, 7, 35).sum(); // returns 172

정수 값의 평균을 얻기 위해 Average() 메소드를 호출 하고, double 유형의 값을 반환하므로 getAsDouble()을 사용해야 한다.

1
2
3
double avg = IntStream.of(20, 98, 12, 7, 35)
  .average()
  .getAsDouble(); // returns 34.4

3. 범위

범위를 기반으로 IntStream을 만들 수도 있다.

1
2
3
4
int sum = IntStream.range(1, 10)
  .sum(); // returns 45
int sum = IntStream.rangeClosed(1, 10)
  .sum(); // returns 55

위의 코드 조각에서 볼 수 있듯이 정수 값 range()rangeClosed()의 범위를 만드는 두 가지 방법이 있다.

차이점은 range()의 끝은 배타적이지만 rangeClosed()에는 포함된다는 것 이다.

Range 메서드는 IntStream 및 LongStream에만 사용할 수 있다.

for-each 루프의 형태로 range를 사용할 수 있다.

1
2
IntStream.rangeClosed(1, 5)
  .forEach(System.out::println);

이를 for-each 루프 교체로 사용하면 병렬 실행도 활용할 수 있다는 장점이 있다.

1
2
3
IntStream.rangeClosed(1, 5)
  .parallel()
  .forEach(System.out::println);

이러한 루프가 유용하기는 하지만 단순성, 가독성 및 일부 경우 성능 때문에 간단한 반복을 위해 기능적 루프 대신 기존 for 루프를 사용하는 것이 더 좋다.

4. 복싱과 언박싱

기본 값을 래퍼 값으로 변환해야 할 때가 있다.

이러한 경우 boxed() 메서드를 사용할 수 있다.

1
2
3
4
List<Integer> evenInts = IntStream.rangeClosed(1, 10)
  .filter(i -> i % 2 == 0)
  .boxed()
  .collect(Collectors.toList());

래퍼 클래스 스트림에서 기본 스트림으로 변환할 수도 있다.

1
2
3
4
5
// returns 78
int sum = Arrays.asList(33,45)
  .stream()
  .mapToInt(i -> i)
  .sum();

기본 스트림을 생성하려면 언제든지 mapToXxx 및 flatMapToXxx 메서드를 사용할 수 있다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.