他の人はなぜ可変個ではないのかをすでに答えていますがMath.max
、可変個の関数が導入されたときにそのようなメソッドが作成されない理由には答えていません。
私もそれを知らないので(開いているバグレポートがあります)、推測することしかできません:
に実装されていないのは事実ですMath
が、調べてみるCollections
と以下のような方法がありました。
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll) {
...
}
型シグネチャは見栄えが悪いですが (共分散と反分散を処理するのに十分な柔軟性が必要です)、簡単に使用できますCollections.max(Arrays.asList(-13, 12, 1337, 9));
。
さらに良いことに、このメソッドは double だけでなく、Comparable
インターフェイスを実装するすべての型を処理できます。
それにもかかわらず、提案された解決策も解決策もCollections
オブジェクト指向ではありません。それらは単なる静的メソッドです。幸いなことに、JDK8ではこれが変更されます。
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
int max(List<Integer> list) {
Optional<Integer> opt = list.stream().max((a,b) -> a-b);
return opt.orElse(Integer.MAX_VALUE);
}
max(Arrays.asList(-13, 12, 1337, 9)); // 1337
max(Arrays.asList()); // 2147483647
今後のリリースでは、プロジェクト Lambdaでコレクション ライブラリが作り直され、よりオブジェクト指向になりました。上記の例では、最大要素を決定するための簡単で読みやすい方法を提供するためにラムダが使用されています。以下も機能します。
import static java.util.Comparators.naturalOrder;
Arrays.asList(-13, 12, 1337, 9)
.stream()
.max(naturalOrder())
.ifPresent(System.out::println); // 1337
代わりにmax
、高次関数を使用することもできますreduce
:
Arrays.asList(-13, 12, 1337, 9)
.stream()
.reduce((a,b) -> a > b ? a : b)
.ifPresent(System.out::println); // 1337
別の詳細は、の使用ですOptional
。上記の例のように高階関数の構成により、エラーハンドリングを簡略化するための型です。
ラムダ提案には、Math.max の可変長形式を実装する必要がなくなるいくつかの利点があります。
- オブジェクト指向です
- ポリモーフィックです。
List
これは、すべてのタイプのコレクション ( 、Set
、など)Stream
で使用できることを意味します。Iterator
- 表現力豊かで分かりやすい
- オンザフライの並列化が可能です。に変更
.stream()
するだけ.parallelStream()