2014-06-09 27 views
33

Ho un double[] e voglio filtrare (creare un nuovo array senza) valori negativi in ​​una riga senza aggiungere loop for. È possibile utilizzare espressioni lambda Java 8?Array di filtri Java 8 con Lambda

in Python che sarebbe stato così che utilizzano generatori:

[i for i in x if i > 0] 

è possibile fare qualcosa di simile concisa in Java 8?

+0

Cosa intendi con _filter_? Vuoi dire creare un nuovo array senza quei valori? –

+2

Non sono sicuro se possibile con un 'double []', ma facile con un 'List': http://www.dreamsyssoft.com/java-8-lambda-tutorial/filter-tutorial.php – Avery

+1

FYI che si chiama una lista comprensione. I generatori usano parens, come questo: '(io per i in x se io> 0)' – djsmith

risposta

59

Sì, è possibile farlo creando un DoubleStream dall'array, filtrando i negativi e convertendo lo stream in un array. Ecco un esempio:

double[] d = {8, 7, -6, 5, -4}; 
d = Arrays.stream(d).filter(x -> x > 0).toArray(); 
//d => [8, 7, 5] 

Se si desidera filtrare una matrice di riferimento che non è un Object[] è necessario utilizzare il metodo toArray che prende un IntFunction per ottenere un array di tipo originale come il risultato:

String[] a = { "s", "", "1", "", "" }; 
a = Arrays.stream(a).filter(s -> !s.isEmpty()).toArray(String[]::new); 
+1

Penso che sia tanto conciso quanto Java otterrà: D – Makoto

+0

Penso che dovrebbe essere double [] toArray = Arrays.stream (d) .filter (x -> x> 0) .toArray(); – Raj

+0

@Raj valido anche se si desidera assegnare l'array restituito a un riferimento separato. – Alex