Integer이 우리가 볼 때 null 정보도 제공하고 이점에서 보면 DB에 쿼리로 데이터를 전달할 때도 상당히 유용하다는 장점이 있는데 왜 많이 안쓸까? 라는 점이 궁금했다.
실행은 이렇게 해봤다. 객체에 데이터를 10만개를 넣고 sum을 해보았다.
// 일반 stream 호출(언박싱을 하는 상태) Instant start = Instant.now(); city.stream().map(City::getCost).reduce(0,Integer::sum); Instant finish = Instant.now(); long elapsedTime = Duration.between(start, finish).toMillis(); System.out.println("elapsedTime(ms) : " + elapsedTime); // intStream 호출(언박싱을 안하는 상태) start = Instant.now(); city.stream().mapToInt(City::getCost).sum(); finish = Instant.now(); elapsedTime = Duration.between(start, finish).toMillis(); System.out.println("elapsedTime(ms) : " + elapsedTime);
다음은 실행시간이다.
놀랍게도 약 2배이상 더 빠르다는 것을 알 수 있다.
이유는 일반 stream은 map을 통해 Stream(Integer)을 받고 이 정보는 Integer을 연산처리를 위해 int로 변경하는 언박싱 시간이 intStream보다 더 걸리기 때문이다.
Integer은 arrayList 등에 많이 쓰지만 결정적으로 연산을 할 수 없다는 단점이 있다. 따라서 언박싱을 할 수 있다는 환경에서는 Integer을 남발해서 쓰는 것은 효율적이지 못하다는 생각이 들었다.