相关疑难解决方法(0)

为什么必须用lambda体中的完整代码块来包含throw语句?

如果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)

java lambda exception java-8

37
推荐指数
3
解决办法
793
查看次数

操作数堆栈上的错误类型...使用jdk 8,lambdas与匿名内部类失败,为什么?

运行下面的代码会导致错误消息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)

java lambda java-8

12
推荐指数
1
解决办法
4395
查看次数

java 8中stream().map()和stream.map({})之间的区别

昨天我偶然发现了一些我既不懂也不能找到解释的东西:

请考虑以下操作:

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().

干杯,本

java java-8

7
推荐指数
1
解决办法
3390
查看次数

标签 统计

java ×3

java-8 ×3

lambda ×2

exception ×1