我正在学习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传递了吗?
发布于 2017-06-28 14:40:47
错误消息应该是Ambiguous method reference: both toString() and toString(int) from the type Integer are eligible。这是因为toString和toString(int)都有资格在这里使用。
这两者都有可能是:
.map(i -> i.toString(i))
.map(i -> i.toString()) 而且它工作得很好,因为String::valueOf没有这样的重载方法,因此编译器对此很满意。
https://stackoverflow.com/questions/44805016
复制相似问题