すでに正解が出ているので、あくまでもmomon-gaさんの回答の補足説明として読んでください。
正か、負か、それが問題だ
Comparaterの役割は、正、0 、負、によって二つの引数の大小同値を判定すること。数値型の場合、計算で判定できます。
(x,y) -> x - y
Streamのmin()/max()/sum()
これらはどれも reduce() で書き換えることができます。リダクション(畳み込み)と呼ばれる操作で累積的な結果を返します。reduce()のなかのラムダ式を見てください。
reduce((x,y) -> 何らかの結合的な操作を実行して「累積的な値」を返す)
ラムダ式の引数に役割があります。引数 x は「先頭の要素」か「累積的な値」、y は順次処理される「個別の要素」です。操作によって「累積的な値」 の意味は以下のように異なります。どれも y の値を使って、x の値を更新します。
- min の場合は、x は最小値
x と y を比較して小さい値を返す。返された値が次の x の値として使われる。
比較はComparatorで行ってもよい。
- max の場合は、x は最大値
x と y を比較して大きい値を返す。返された値が次の x の値として使われる。
比較はComparatorで行ってもよい。(minと同じComparatorです)
- sum の場合は、x は合計値
x に y を加算した値を返す。返された値が次の x の値として使われる。
内部動作としてこのことを理解してください。
リダクションを使う最小値の取得
リダクションでは、Integer::minを指定すれば目的の動作が行われます。以下、listの型はList<Integer>です。
Java
1list.stream().reduce((x,y)->(Integer.compare(x,y) <= 0) ? x : y).get();
2list.stream().reduce(Integer::min).get();
min()を使う最小値の取得
最初に説明したとおり、Comparatorを渡さなければなりません。
Java
1list.stream().min((x,y)-> x - y).get();
2list.stream().min(Integer::compare).get();
間違いの解説
以下の最初の行がComparatorの代わりにInteger.minを指定する間違いです。これと等価なのが第二行目のreduceです。minの結果は正負判定に使われています。どちらも同じ動作であることを確認してください。
Java
1list.stream().min(Integer::min).get();
2list.stream().reduce((x,y)->(Integer.min(x,y) <= 0) ? x : y).get();
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/16 11:14
2020/04/16 11:29
2020/04/16 11:54 編集
2020/04/16 13:04
2020/04/16 14:10
2020/04/16 14:50
2020/04/16 15:23 編集
2020/04/16 15:48
2020/04/16 17:34
2020/04/17 02:11
2020/04/17 03:37