Naturalmente, dipende sempre dalle circostanze. Prendi il tuo primo esempio:
List<Integer> list = Arrays.asList(1,4,3,9,7,4,8);
list.stream().max(Comparator.naturalOrder()).ifPresent(System.out::println);
Se si vuole fare la cosa stesso in modo efficiente, è necessario utilizzare
IntStream.of(1,4,3,9,7,4,8).max().ifPresent(System.out::println);
che non comporta alcuna auto-boxing. Ma se la tua ipotesi è di avere un List<Integer>
in anticipo, quella potrebbe non essere un'opzione, quindi se sei solo interessato al valore max
, Collections.max
potrebbe essere la scelta più semplice.
Ma questo porterebbe alla domanda perché si dispone di un List<Integer>
in anticipo. Forse, è il risultato del vecchio codice (o del nuovo codice scritto usando il vecchio modo di pensare), che non ha avuto altra scelta che usare il pugilato e Collection
s come non c'era alternativa nel passato?
Quindi forse dovresti pensare alla fonte che produce la collezione, prima di preoccuparti di come consumarla (o bene, pensa ad entrambi allo stesso tempo).
Se hai a disposizione un Collection
e tutto ciò che serve è una singola operazione terminale per il quale esiste una semplice implementazione Collection
base, si può utilizzare direttamente senza preoccuparsi con il Stream
API. I progettisti dell'API hanno riconosciuto questa idea poiché hanno aggiunto metodi come forEach(…)
all'API Collection
invece di insistere su chiunque utilizzi stream().forEach(…)
. E Collection.forEach(…)
non è una semplice scorciatoia per Collection.stream().forEach(…)
, infatti, è già definita sull'interfaccia più astratta Iterable
che non ha nemmeno un metodo stream()
.
Btw., È necessario comprendere la differenza tra Collections.binarySearch
e Stream.filter/findAny
. Il primo richiede che la raccolta sia ordinata e se tale requisito è soddisfatto, potrebbe essere la scelta migliore. Ma se la raccolta non è ordinata, una semplice ricerca lineare è più efficiente dell'ordinamento solo per un singolo uso della ricerca binaria, per non parlare del fatto, che la ricerca binaria funziona con List
s solo mentre filter/findAny funziona con qualsiasi flusso supportare ogni tipo di raccolta di fonti.
Stai chiedendo solo su questo metodo specifico? –
Se il tuo unico interesse è ottenere il valore 'max' dalla lista, il metodo' Collections' è la strada da percorrere. – GriffeyDog
Inoltre, il comportamento 'Opzionale' rispetto a' NoSuchElementException'. –