2015-08-21 4 views
8

Io attualmente faccio:Come posso creare IntStream dal set <Integer>?

Set<Integer> integers = ... // sourced from elsewhere in code 
IntStream intStream = integers.stream().mapToInt(value -> value); 

sembra superfluo dover mappare il valore per il valore, per convertire il Stream<Integer>-IntStream. C'è un modo per farlo senza quella sezione ridondante mapToInt(...)?

+6

No. Ma usando 'Integer :: intValue' invece di 'value -> value' lo renderebbe meno strano. –

risposta

8

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);