[Java 8] 12. Numeric Streams

seony·2023년 5월 1일

java8

목록 보기
12/16

Numeric Stream

  • 내부적으로 합계를 계산하기 전에 Integer를 기본형으로 언박싱해야하기 때문에 박싱 비용이 숨어 있다.
  • 종류:
    • IntStream
    • LongStream
    • DoubleStream

Ranges

  • range(start, end)
    • end 포함 ❌
  • rangeClosed(start, end)
    • end 포함
  • DoubleStream 에서는 range, rangeClosed 를 사용할 수 없으므로 Instream 으로 range 를 사용 후 asDoubleStream()으로 사용해야 한다.
package com.learn.java.numericstreams;

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

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

        // IntStream range
        IntStream intStream = IntStream.range(1, 50);
        System.out.println("Range Count " + intStream.count());
        IntStream.range(1, 50).forEach((value -> System.out.print(value + ", ")));

        System.out.println();

        System.out.println("Range Closed Count " + IntStream.rangeClosed(1, 50).count());
        IntStream.rangeClosed(1, 50).forEach((value -> System.out.print(value + ", ")));

        // LongStream
        System.out.println("Long Stream Range Closed Count " + LongStream.rangeClosed(1, 50).count());
        LongStream.rangeClosed(1, 50).forEach(value -> System.out.print(value + ", "));

        // DoubleStream 은 range 를 사용할 수 없음
        // IntStream 을 통해서 asDoubleStream()으로 만들어서 사용해야함
        System.out.println();
        IntStream.range(1, 50).asDoubleStream().forEach(value -> System.out.print(value + ", "));
    }
}

Aggregate

  • 종류
    • sum()
    • max()
    • min()
    • average()
package com.learn.java.numericstreams;

import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;
import java.util.stream.IntStream;
import java.util.stream.LongStream;

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

		// sum() 사용
        int sum = IntStream.rangeClosed(1, 50).sum();
        System.out.println("Sum is : " + sum);

		// IntStream, max() 사용
        OptionalInt optionalInt = IntStream.rangeClosed(1, 50).max();
        System.out.println(optionalInt.isPresent() ? optionalInt.getAsInt() : 0);

        // LongStream, min() 사용
        OptionalLong optionalLong = LongStream.rangeClosed(50, 100).min();
        System.out.println(optionalLong.isPresent() ? optionalLong.getAsLong() : 0);

        // average() 사용, Double 처리
        OptionalDouble optionalDouble = IntStream.rangeClosed(1, 50).average();
        System.out.println(optionalDouble.isPresent() ? optionalDouble.getAsDouble() : 0);


    }
}

Boxing() & UnBoxing()

  • Boxing()
    • 기본형 ➜ Wrapper 클래스
    • intInteger
  • UnBoxing()
    • Wrapper 클래스 ➜ 기본형
    • Integerint
package com.learn.java.numericstreams;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class NumericStreamsBoxingUnboxingExample {

    // boxing
    public static List<Integer> boxing() {
        return IntStream.rangeClosed(1, 10) // intstream of 10 elements
                // int -> Integer로 변환
                .boxed()
                // Integer
                .collect(Collectors.toList());
    }

    // unboxing
    public static int unBoxing(List<Integer> integerList) {
        // wrapper to primitive
        return integerList.stream()
                // Wrapper Integer Values
                .mapToInt(Integer::intValue) // intstream(intValue of the Wrapper class)
                .sum();
    }

    public static void main(String[] args) {
        System.out.println("Boxing : " + boxing());

        List<Integer> integerList = boxing();
        System.out.println("Unboxing : " + unBoxing(integerList));
    }
}

0개의 댓글