2014-06-09 35 views
33

Tôi có một double[] và tôi muốn lọc ra (tạo một mảng mới mà không có) giá trị âm trong một dòng mà không cần thêm for vòng lặp. Điều này có thể sử dụng các biểu thức Java 8 lambda không?Java 8 Filter Array Sử dụng Lambda

Trong python nó sẽ là này sử dụng máy phát điện:

[i for i in x if i > 0] 

Có thể làm điều gì đó ngắn gọn tương tự trong Java 8?

+0

Ý bạn là gì bởi _filter out_? Bạn có nghĩa là tạo ra một mảng mới mà không có những giá trị đó? –

+2

Không chắc chắn nếu có thể với một 'đôi []', nhưng dễ dàng với một 'Danh sách': http://www.dreamsyssoft.com/java-8-lambda-tutorial/filter-tutorial.php – Avery

+1

FYI đó được gọi là một danh sách bao quát. Máy phát điện sử dụng parens, như thế này: '(i cho i in x if i> 0)' – djsmith

Trả lời

59

Có, bạn có thể thực hiện việc này bằng cách tạo một DoubleStream từ mảng, lọc bỏ các từ khóa phủ định và chuyển đổi luồng trở lại thành một mảng. Dưới đây là một ví dụ:

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

Nếu bạn muốn lọc một mảng tài liệu tham khảo mà không phải là một Object[] bạn sẽ cần phải sử dụng phương pháp toArray mà phải mất một IntFunction để có được một mảng của các loại ban đầu là kết quả:

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

Tôi nghĩ rằng đó là về ngắn gọn như Java sẽ nhận được: D – Makoto

+0

Tôi nghĩ rằng nó nên được gấp đôi [] toArray = Arrays.stream (d) .filter (x -> x> 0) .toArray(); – Raj

+0

@Raj cũng hợp lệ nếu bạn muốn gán mảng được trả về cho tham chiếu riêng. – Alex

Các vấn đề liên quan