Java Stream collect after flatMap returns List instead of List

I tried the following code using Java 8 streams:

Arrays.asList("A", "B").stream() .flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1)).collect(Collectors.toList());

What I get is a List<Object> while I would expect a List<String>. If I remove the collect and I try:

Arrays.asList("A", "B").stream().flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1));

I correctly get a Stream<String>.

Where am I wrong? Can someone help me?

Many thanks in advance.


The problem is due to Eclipse (now using Kepler SR2 with java 8 patch 1.0.0.v20140317-1956). The problem does non appear if compiling using javac or, as commented by Holger, using Netbeans


Type inference is a new feature. Until tools and IDEs are fully developed I recommend using explicitly typed lambdas. There ware cases where Eclipse even crashed if an explicit cast was missing, but that is fixed now.

Here's a workaround:

With a typed "s1": .flatMap(s -> Arrays.asList("X", "Y").stream().map((String s1) -> s + s1)) .collect(Collectors.toList());

Or with a genric parameter: .flatMap(s -> Arrays.asList("X", "Y").stream().<String>map(s1 -> s + s1)) .collect(Collectors.toList());

The same is true if you add the parameter before flatMap instead of map.

But I suggest you use s::concat: .flatMap(s -> Arrays.asList("X", "Y").stream().map(s::concat)) .collect(Collectors.toList());

人吐槽 人点赞



用户名: 密码:
验证码: 匿名发表


查看评论:Java Stream collect after flatMap returns List instead of List