IntStream#sum()の戻り値がOptionalIntでないことに納得がいかない
あまりに納得がいかなかったので、飯炊きの合間にブログです。
いまJava SE 8研修テキストの仕上げにかかっているところなんですが、Stream APIを調べていて気になることがありました。
IntStream#sum()の戻り値、なんでこれだけOptionalIntじゃないの?average()はOptionalDoubleだし、max()もmin()もOptionalIntになってるのに。
— 多田真敏 (@suke_masa) 2014, 10月 2
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
となります。
なんでこうなるねん。
さて、飯が炊けたのでご飯にしよう。