No, è necessario utilizzare .mapToInt(value -> value)
o (mi sembra migliore) .mapToInt(Integer::intValue)
. Come Stream
è la classe generica, dovrebbe funzionare per qualsiasi tipo di elemento di flusso generico, quindi è impossibile aggiungere qualcosa di più semplice all'API in modo sicuro dal tipo. Si consideri, ad esempio, che esiste il metodo asIntStream()
nell'interfaccia Stream
. Sarebbe certamente un aspetto migliore come:
IntStream intStream = integers.stream().asIntStream();
Tuttavia nulla si fermava di chiamare tale metodo per Stream<String>
per esempio. In Java non è possibile abilitare la chiamata del metodo solo a particolari parametri generici. Quindi chiamarlo accidentalmente sul flusso di un altro tipo si compila bene, ma si traduce in un'eccezione di runtime che è cattiva nel linguaggio tipizzato staticamente. Tuttavia utilizzando .mapToInt(value -> value)
o .mapToInt(Integer::intValue)
si forza il controllo del tipo: è necessario fornire una funzione che restituisce int
, quindi stringStream.mapToInt(value -> value)
segnala correttamente l'errore di compilazione.
Se davvero a cuore, siete liberi di creare un metodo statico nel progetto come questo:
public class Streams {
public static IntStream intStream(Collection<Integer> c) {
return c.stream().mapToInt(Integer::intValue);
}
}
e usarlo come
IntStream intStream = Streams.intStream(integers);
fonte
2015-08-21 11:32:55
No. Ma usando 'Integer :: intValue' invece di 'value -> value' lo renderebbe meno strano. –