Tôi nhận ra rằng việc triển khai lambda Java 8 có thể thay đổi, nhưng trong lambda build b39, tôi thấy rằng niềng răng chỉ có thể được bỏ qua khi biểu thức lambda trả về một kiểu không trống. Ví dụ, đây biên dịch:Khi nào là niềng răng tùy chọn trong cú pháp lambda Java 8?
public class Collections8 {
public static void main(String[] args) {
Iterable<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.filter(e -> e.length() > 4).forEach(e -> { System.out.println(e); });
}
}
Nhưng tháo niềng răng như thế này:
names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e));
cung cấp cho các lỗi
Collections8.java:6: error: method forEach in interface Iterable<T> cannot be applied to given types;
names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e));
^
required: Block<? super String>
found: lambda
reason: incompatible return type void in lambda expression
where T is a type-variable:
T extends Object declared in interface Iterable
bất cứ ai có thể giải thích những gì đang xảy ra ở đây?
nếu nó vẫn đang được phát triển và có thể thay đổi tại sao thậm chí yêu cầu? câu trả lời có thể đã lỗi thời ngay lập tức. – user12345613
Bởi vì tôi muốn hiểu lý do đằng sau nó. – hertzsprung
bạn lấy phương pháp lọc từ đâu? Tôi có java 8 lambda versin, và mã yr không biên dịch. – NimChimpsky