雖然其他人已經回答了爲什麼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));
使用所有的功能之後,只是在不同的地方。
更好:這種方法不僅可以處理雙打,而且可以處理所有類型的接口。
儘管如此,無論您的建議解決方案還是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修改,以更加面向對象。在上面的例子中,Lambdas用來提供一個簡單易讀的方法來確定最大元素。下面將工作太:
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()
數學中的Java 1.0中引入的。 1.5中的可變參數... – Kai 2013-02-23 11:45:52