Java 8 - 类型不匹配: 无法将List<Serializable>转换为List<String>

10

我有一个字符串列表:

List<String> list = Arrays.asList("a1,a2", "b1,b2");

然后要将列表中的所有内容转换为:"a1","a2","b1","b2",可以编写以下代码:

List<String> ss1 = list.stream()
                       .flatMap(s -> Stream.of(s.split(",")))
                       .collect(Collectors.toList());

但是我遇到了一个错误:"类型不匹配:无法将List<Serializable>转换为List<String>"。我通过将代码更改为以下内容来解决这个问题:

List<String> ss2 = list.stream()
                       .flatMap(s -> Arrays.stream(s.split(",")))
                       .collect(Collectors.toList());

Eclipse Neon认为问题出在flatMap的返回类型上。第一个flatMap返回一个List<Serializable>,而第二个返回一个List<String>

但是Stream.of()Arrays.stream()都返回一个<T> Stream<T>(Eclipse的建议是它们都返回一个Stream<String>)。

而且,Stream.of()内部使用(并返回)Arrays.stream()的输出结果。所以,第一个例子中到底出了什么问题呢?


2
使用逗号分割并返回流。 - Boris the Spider
4
你的代码能在Java 1.8上使用IntelliJ Idea 2016运行,也许你应该查看一下你IDE的设置。 - Andrea
2
@Boris the Spider:在flatMap的使用案例中:.flatMap(Pattern.compile(",")::splitAsStream)... - Holger
1
@Boris the Spider:嗯,这是一个边缘情况。如果模式像“,”这样简单,方法String.split将走快速路径,而不使用正则表达式引擎。但仍然意味着创建并急切地填充数组。 - Holger
2
注意,第一个代码片段在Eclipse Neon.2上无法编译通过。但是它可以在Neon.1和Mars.2上工作...所以看起来这里存在Eclipse回归问题。错误已经报告 - Tunaki
显示剩余2条评论
1个回答

6

这是一个Eclipse的bug

Bug 508834,感谢@Tunaki


请注意方法签名:

//Stream.of
<T> Stream<T> of(T... values)
//Arrays.stream
<T> Stream<T> stream(T[] array)

现在,对于Arrays.stream来说,很明显使用类型为T的数组调用将返回一个Stream<T>。但是对于Stream.of,它应该返回Stream<T>还是Stream<T[]>?也就是说,可变参数的类型是什么;您是将数组作为第一个参数传递(因此可变参数是数组的数组),还是将数组作为所有参数传递?
这就是您需要解决的问题。

不确定这是否是正确答案。如果您查看Stream.of()的源代码,您会发现它在内部使用Arrays.stream()。而且两个静态函数具有相同的返回类型。 - freedev
4
啊...我试过在命令行使用Maven,两行代码都编译成功了。这明显是与Eclipse IDE相关的问题。 - freedev
3
Stream.of是一个可变参数方法,因此适用于有多个参数的情况,而Arrays.stream更适用于已有数组的情况。由于在Stream.of(T...)的实现代码中存在一个现有的数组,将其委托给Arrays.stream是完全合理的。尤其是在最低层面没有技术差异的情况下。但是,在API/源代码级别上使用正确的方法是推荐的。 - Holger
3
请注意,您可以编写 Stream.<String[]>of(s.split(",")) 来创建一个仅包含 String[] 对象的单一元素流,而 Stream.< String > of(s.split(",")) 将创建一个由拥有数组中元素数量相同的 String 实例组成的流。类型推断必须在这两种情况之间进行决策,显然,那个版本的 Eclipse 做出了错误的决定。相比之下,对于 Arrays.stream(s.split(",")),则没有这样的决策需要做出。 - Holger
4
是的,这是一个Eclipse的bug,在Neon.2中出现了退步。在之前的版本中,这个功能是可用的,请参见我在问题评论中的回答 - Tunaki
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接