关于 java8 中 stream 流的 map 方法的疑问?

各位大佬,为什么这里 map 里面 x->逻辑 这种写法就没有问题,而 x->{逻辑} 这种写法就会报错呢?

代码如下图:
这样会报错:
image.png

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        List<Future<String>> futures = new ArrayList<>();
        System.out.println("32323223");
        List<Integer> list = Arrays.asList(1, 2, 3);
        List<String> collect = list.stream().map(x -> {
                    CompletableFuture.supplyAsync(() -> {
                        System.out.println("执行开始:" + new Date());
                        // 睡眠一秒,模仿处理过程
                        try {
                            Thread.sleep(1000L);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("执行结束:" + new Date());
                        return new Date().toString();
                    }, executorService);
                }
        ).map(CompletableFuture::join).collect(Collectors.toList());

        executorService.shutdown();
        System.out.println(collect);
        System.out.println("77819");
    }

这样不会:
image.png

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        List<Future<String>> futures = new ArrayList<>();
        System.out.println("32323223");
        List<Integer> list = Arrays.asList(1, 2, 3);
        List<String> collect = list.stream().map(x ->
                CompletableFuture.supplyAsync(() -> {
                    System.out.println("执行开始:" + new Date());
                    // 睡眠一秒,模仿处理过程
                    try {
                        Thread.sleep(1000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("执行结束:" + new Date());
                    return new Date().toString();
                }, executorService)
        ).map(CompletableFuture::join).collect(Collectors.toList());

        executorService.shutdown();
        System.out.println(collect);
        System.out.println("77819");
    }
阅读 2.6k
3 个回答

因为你没 return 啊……

t -> t + 1;

t -> {
   return t + 1;
}

的缩写。你写成

t -> {
   t + 1;
}

当然不对了。

这里不是stream流的map方法的问题。 你的lambda表达式使用不对。如上面答主所说。去除'{}'即可。

  • Lambda 表达式的基础语法 Java8引入了操作 “->” Lambda的操作符
  • 左侧:Lambda表达式的参数列表
  • 右侧:Lambda表达式中所需执行的功能,Lambda体

语法格式一:无参数,无返回值的模式

  Runnable runnable = () -> System.out.println("hello lambda");

语法格式二:有参数,无返回值的模式。若左侧只有一个参数,小括号可以不写

 Consumer<String> consumer = (x) -> System.out.println(x);

语法格式二:有两个以上的参数,有返回值的模式。并且lambda中有多条语句

 Comparator<Integer> comparator = (x, y) -> {
        System.out.println("多条语句的Lambda的语句");
        return Integer.compare(x, y);
    };

语法格式二:有两个以上的参数,有返回值的模式。如果只有一条语句,可以简写如下
左侧的参数列表可以不用标识参数类型,因为jvm可以根据接口泛型去推断上下文的参数类型
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题