Mentre altri hanno già risposto perché il Math.max
non è variadico, non hanno risposto perché un tale metodo non viene creato quando vengono introdotte funzioni variadiche.
ho anche non lo so (c'è un open bug-report) quindi posso solo immaginare:
E 'vero che non è implementato in Math
, ma se guardiamo in Collections
v'è il seguente metodo:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll) {
...
}
Mentre la firma di tipo sembra brutto (che deve essere sufficientemente flessibile per gestire covarianza e controvarianza), può essere facilmente utilizzato con Collections.max(Arrays.asList(-13, 12, 1337, 9));
Dopo aver implementato tutte le funzioni, proprio in un posto diverso.
Ancora meglio: questo metodo può gestire non solo i doppi, ma tutti i tipi che implementano l'interfaccia Comparable
.
Tuttavia, né la soluzione suggerita, né la soluzione in Collections
sono orientate agli oggetti, sono solo metodi statici. Per fortuna con JDK8 questo cambierà:
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
Per la prossima versione della libreria collezione viene rielaborato in Project Lambda ad essere più orientato agli oggetti. Nell'esempio sopra, Lambdas viene utilizzato per fornire un modo facile e leggibile per determinare l'elemento massimo. Di seguito funzionerebbe ugualmente:
import static java.util.Comparators.naturalOrder;
Arrays.asList(-13, 12, 1337, 9)
.stream()
.max(naturalOrder())
.ifPresent(System.out::println); // 1337
Anziché max
si potrebbe utilizzare anche la funzione di ordine superiore reduce
:
Arrays.asList(-13, 12, 1337, 9)
.stream()
.reduce((a,b) -> a > b ? a : b)
.ifPresent(System.out::println); // 1337
altro dettaglio è l'uso di Optional
. È un tipo per semplificare la gestione degli errori a causa della composizione delle funzioni di ordine superiore, come mostrato negli esempi sopra.
La proposta lambda ha diversi vantaggi che rendono necessario implementare una forma di variadic Math.max:
- Si object oriented
- È polimorfico. Ciò significa che può essere utilizzato con ogni tipo di raccolta (
List
, Set
, Stream
, Iterator
ecc)
- E 'espressiva e facile da capire
- Permette on-the-fly parallelizzazione. Basta cambiare
.stream()
a .parallelStream()
Math è stato introdotto in Java 1.0. Varargs in 1.5 ... – Kai