IntStream#sum()の戻り値がOptionalIntでないことに納得がいかない

あまりに納得がいかなかったので、飯炊きの合間にブログです。

 

いまJava SE 8研修テキストの仕上げにかかっているところなんですが、Stream APIを調べていて気になることがありました。

 

 

OptionalIntについてはこちら↓

Java SE 8でOptionalIntを使ってみよう - Java EE 事始め!

 

こんなことをつぶやいたら、「要素が無いなら、合計は0を返すのでintなのでは?」というリプライをいただきました。

 

確かに、おっしゃるとおりだと思います。

平均のほうは、要素が無いと0で除算することになるので、OptionalDoubleにせざるを得ません。

合計は除算の必要が無いので、要素が無いなら0を返せばええやん、というのは分かります。

ちなみに、

int sum = IntStream.empty().sum();

のように空のIntStreamでsum()すると、0が返ってきます。

 

ただしそうすると、

int sum = IntStream.of(-1, 1, -1, 1).sum();

のように、要素があって本当に合計値が0の場合と、区別がつきません。

そもそもOptionalIntの存在意義って、こういう区別をするためなんじゃないの、というのが僕の考えです。

ですから、僕の考えでは、このコードは

OptionalInt op = IntStream.empty().sum();

op.ifPresent(sum -> System.out.println(sum));

のように書くべきではないのかなあ、と思います。

 

ただ、どんなシチュエーションでこういう区別が必要になってくるのかというと、僕もパッとは思いつかないのです・・・。

やからやっぱり、intでもええんかなあ・・・。

ええんかなあと言っても、APIがそーなってるからそれを使うしかないんですけれども。

 

ちなみに同じ理由で、IntSummaryStatisticsのgetSum()・getAverage()・getMax()・getMin()がOptionalXxxになっていないのも気になります。

 

IntSummaryStatistics summary = IntStream.empty().summaryStatistics();
long sum = summary.getSum();
double average = summary.getAverage();
int max = summary.getMax();
int min = summary.getMin();

 

上記のコードでは、

sum = 0
average = 0.0
max = -2147483648
min = 2147483647
となります。

なんでこうなるねん。

 

さて、飯が炊けたのでご飯にしよう。