Chạy mã bên dưới dẫn đến thông báo lỗi Bad type on operand stack
.Loại không hợp lệ trên ngăn xếp hạng ... sử dụng jdk 8, lambdas với các lớp bên trong vô danh không thành công, tại sao?
public static void main(String args[]) {
TransformService transformService = (inputs) -> {
return new ArrayList<String>(3) {{
add("one");
add("two");
add("three");
}};
};
Collection<Integer> inputs = new HashSet<Integer>(2) {{
add(5);
add(7);
}};
Collection<String> results = transformService.transform(inputs);
System.out.println(results.size());
}
public interface TransformService {
Collection<String> transform(Collection<Integer> inputs);
}
Tuy nhiên việc loại bỏ dấu ngoặc kép đôi (các lớp bên trong vô danh) trong lamda cho phép mã chạy như mong đợi, tại sao? Các công trình bên dưới:
public class SecondLambda {
public static void main(String args[]) {
TransformService transformService = (inputs) -> {
Collection<String> results = new ArrayList<String>(3);
results.add("one");
results.add("two");
results.add("three");
return results;
};
Collection<Integer> inputs = new HashSet<Integer>(2) {{
add(5);
add(7);
}};
Collection<String> results = transformService.transform(inputs);
System.out.println(results.size());
}
public interface TransformService {
Collection<String> transform(Collection<Integer> inputs);
}
}
Lỗi trình biên dịch? Đây là phiên bản đầu truy cập sau khi tất cả ...
(Điều này sẽ không biên dịch trừ khi bạn có mới nhất jdk 8 lambda download.)
Thẻ lambda có nghĩa là cho các ngôn ngữ khác ngoài Java như C#, C++. – Lion
@Lion: Tôi tin rằng Java 8 thực hiện lambdas (tôi chưa bao giờ sử dụng nó, vì vậy tôi không biết điều này cho một thực tế), và vì vậy thẻ này dường như là thích hợp cho câu hỏi. –
@Lion đó là chỉ vì Java đã không có lambdas trước đây. Một lambda là một lambda, ngay cả khi nó là một phiên bản alpha của ngôn ngữ. –