【问题标题】:Concat Stream of String and Integer [duplicate]字符串和整数的连接流[重复]
【发布时间】:2017-06-28 14:13:29
【问题描述】:

我正在学习 Stream,在一次这样的练习中,我试图通过以下代码加入 2 个不同类型的字符串和整数流:

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 已通过?

【问题讨论】:

  • 我知道这一定是重复的......

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


【解决方案1】:

错误消息应该是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 没有这样的重载方法,因此编译器对此很好。

【讨论】:

  • 感谢 Eugene 的澄清。对于重复的问题,我深表歉意,但我无法找到完全相同的场景。也许我将不得不提高我的搜索技能 :)
  • Object::toString 也可以。当 IntelliJ 将 lambda“i -> i.toString()”标记为“可以用方法引用替换”时,我遇到了这个问题。我假设此消息是通过简单的语法检查而生成的,而没有考虑到可能的歧义?
  • @GregH 考虑到 许多 事物可以适合此方法引用替换器,我想只有语法检查才是明智的报告;毕竟 IntelliJ 不适合读心
最近更新 更多