如果lambda函数中有一个语句,我们可以省略为它定义完整的代码块:
new Thread(() -> System.out.println());
Run Code Online (Sandbox Code Playgroud)
为什么抛出异常的语句不是这种情况?这会产生一个编译错误,说明'{' expected:
new Thread(() -> throw new RuntimeException());
Run Code Online (Sandbox Code Playgroud)
当然,将lambda主体封装在代码块中可以:
new Thread(() -> {
throw new RuntimeException();
});
Run Code Online (Sandbox Code Playgroud) 运行下面的代码会导致错误消息Bad type on operand stack.
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,删除lamda中的双括号初始化(匿名内部类)允许代码按预期运行,为什么?以下作品:
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> …Run Code Online (Sandbox Code Playgroud) 昨天我偶然发现了一些我既不懂也不能找到解释的东西:
请考虑以下操作:
Stream.of(1, 2, 3).map(i -> i * 2).forEach(System.out::println);
//This one won't compile
Stream.of(1, 2, 3).map(i -> { i * 2; }).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
似乎第二个可以延伸到
Stream.of(1, 2, 3).map(i -> { return i * 2;}).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
它会编译好.我想出了这个,因为我已经习惯了第一个版本,但我的IDE(Netbeans)总是引用最后一个版本.
所以我的问题是:这两种实现的区别/优势是什么?为什么带有{}块的那个需要返回值?需要该值的位置(编译代码除外)?
更新:
关于在Java 8 lambda语法中何时使用大括号?,这个不能仅仅因为关于lambda表达式语法
Stream.of(1, 2, 3).forEach(i -> { System.out.println(i); });
Run Code Online (Sandbox Code Playgroud)
编译好,所以必须(从我的下面)关于实现map().
干杯,本