2014-06-09 34 views
33

Mam double[] i chcę odfiltrować (utworzyć nową tablicę bez) wartości ujemnych w jednym wierszu bez dodawania pętli for. Czy jest to możliwe przy użyciu wyrażeń lambda w języku Java 8?Java 8 Filter Array przy użyciu Lambda

W Pythonie byłoby to za pomocą generatorów:

[i for i in x if i > 0] 

jest to możliwe do zrobienia czegoś podobnie zwięzłe w Java 8?

+0

Co masz na myśli przez _filter out_? Masz na myśli tworzenie nowej tablicy bez tych wartości? –

+2

Nie jestem pewien, czy to możliwe z "podwójnym []", ale łatwo z "List": http://www.dreamsyssoft.com/java-8-lambda-tutorial/filter-tutorial.php – Avery

+1

FYI, który nazywa się listą zrozumienie. Generatory używają paren, takich jak to: '(i dla i w x jeśli i> 0)' – djsmith

Odpowiedz

59

Tak, możesz to zrobić, tworząc z tablicy DoubleStream, odfiltrowując negatywy i konwertując strumień z powrotem do tablicy. Oto przykład:

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

Jeśli chcesz filtrować tablicy odniesienia, który nie jest Object[] trzeba będzie użyć metody toArray który bierze IntFunction aby uzyskać tablicę samego typu co w wyniku:

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

Myślę, że to jest tak zwięzłe jak Java otrzyma: D – Makoto

+0

Myślę, że powinno to być podwójne [] toArray = Arrays.stream (d) .filter (x -> x> 0) .toArray(); – Raj

+0

@Raj jest to również ważne, jeśli chcesz przypisać zwróconą tablicę do osobnego odwołania. – Alex

Powiązane problemy