为何Arrays.asList创建List后直接链式调用stream操作报错?
为什么Arrays.asList创建List后链式流式操作会失败?
嘿,这个问题其实是Java Stream API里一个超容易踩的小坑,我来给你捋明白~
先看你写的代码:
List<Book> list = Arrays.asList(lalka,dziady,chlopi,jutrzenka); list.stream() .map((Book var)-> var.getAuthor().getName()) .forEach(var-> System.out.println(var)); List<Book> list2 = Arrays.asList(lalka, dziady).stream() .map((Book var) -> var.getAuthor().getName()) .forEach(var-> System.out.println(var));
核心问题:返回值类型不匹配
你写的list之所以正常,是因为你只是把Arrays.asList()的结果存成List<Book>,然后调用Stream做处理——这里的forEach()是终端操作,它的作用是执行打印,不需要把它的结果赋值给变量,所以完全没问题。
但list2的写法就出问题了:你试图把forEach()的结果赋值给List<Book>类型的变量,但forEach()的返回类型是void(啥也不返回),根本不是List!这就是编译失败的根源。
怎么修正?分两种情况:
如果想链式操作后得到一个新的List:
别用forEach(),改用collect(Collectors.toList())来收集Stream的结果,之后再按需打印:// 注意这里泛型是String,因为map后得到的是作者名字的Stream List<String> list2 = Arrays.asList(lalka, dziady) .stream() .map(Book::getAuthor) // 可以用方法引用简化代码 .map(Author::getName) .collect(Collectors.toList()); // 打印收集到的结果 list2.forEach(System.out::println);如果只是想链式操作完成打印,不需要保存List:
直接去掉赋值语句就行,让链式操作自然结束在forEach():Arrays.asList(lalka, dziady) .stream() .map(book -> book.getAuthor().getName()) .forEach(System.out::println);
至于你说IntelliJ没给出有效提示,可能是因为链式调用的结构让类型不匹配的提示被暂时掩盖,但本质上还是返回值类型的基础问题~
内容的提问来源于stack exchange,提问作者Jedi401
相关产品推荐
相关产品推荐

