なぜMath.max
はバリデーションではないのですか?他の人は、バリデーシックな機能が導入されたときにそのようなメソッドが作成されない理由については答えていません。
私も(open bug-reportあります)それを知らないので、私は推測することができます。
それは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
をコレクションライブラリは、より多くのオブジェクト指向であることをProject Lambdaに再加工され、今後のリリースでは。上記の例では、Lambdaを使用して、max要素を簡単かつ判読可能な方法で確認しています。以下は、あまりにも動作します:
import static java.util.Comparators.naturalOrder;
Arrays.asList(-13, 12, 1337, 9)
.stream()
.max(naturalOrder())
.ifPresent(System.out::println); // 1337
代わりのmax
1はまた、高階関数reduce
使用することができます別の詳細
Arrays.asList(-13, 12, 1337, 9)
.stream()
.reduce((a,b) -> a > b ? a : b)
.ifPresent(System.out::println); // 1337
をOptional
の使用です。上記の例で示したように、上位関数の構成によるエラー処理を簡素化するための型です。それはそれは多型である
オブジェクト指向され
- :
ラムダ提案は、それが不要Math.maxの可変引数フォームを実装するために作るいくつかの利点があります。これは、それは、オンザフライでの並列化できます
- を理解することは、表現と簡単です
- (など
Iterator
、List
、Set
、Stream
)それは、コレクションのすべてのタイプで使用できることを意味します。ちょうど変更する.stream()
を.parallelStream()
数学は、Java 1.0で導入されました。 1.5のVarargs ... – Kai