Concat流的字符串和整数

时间:2017-06-28 14:13:29

标签: java-8 stream java-stream method-reference

我正在学习Stream,在一次这样的练习中,我试图通过下面的代码加入两个不同类型的String和Integer的流:

Stream<String> fruitStream = Stream.of("Apple", "Mango", "Muskmalon", "Guvava");
Stream<Integer> vegetablesStream = Stream.of(1, 2, 3, 4);

Stream<String> mixStream = Stream.concat(fruitStream, vegetablesStream.map(i -> i.toString()));
mixStream.forEach(System.out :: println);

它运作正常并给了我想要的结果。

然后我尝试使用方法参考:

Stream<String> mixStream = Stream.concat(fruitStream, vegetablesStream.map(Integer :: toString));

它开始抛出错误:

Wrong 1st argument type. Found: 'java.util.stream.Stream<java.lang.String>', required: 'java.util.stream.Stream<? extends T>'
concat (java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>) in Stream cannot be applied to (java.util.stream.Stream<java.lang.String>, java.util.stream.Stream<R>)   
reason: No compile-time declaration for the method reference is found

当我用String :: ValueOf替换我的方法引用时,它工作正常:

Stream<String> mixStream = Stream.concat(fruitStream, vegetablesStream.map(String :: valueOf));
  

我无法理解为什么 Integer :: toString 失败但 String ::   valueOf 传递了吗?

1 个答案:

答案 0 :(得分:3)

错误消息应为Ambiguous method reference: both toString() and toString(int) from the type Integer are eligible。之所以发生这种情况,是因为toStringtoString(int)都有资格在此处使用。

可能两者都是:

  .map(i -> i.toString(i))
  .map(i -> i.toString())      

它工作正常,因为String::valueOf没有这样的重载方法,因此编译器就可以了。