【问题标题】:How do I use java 8's stream collect from scala 2.11?如何使用来自 scala 2.11 的 java 8 的流收集?
【发布时间】:2019-01-18 23:06:12
【问题描述】:

我有这段代码:

import java.util.stream._
import java.util.function._

final case class AbcTest(value: String)

def funToFunction[InT, OutT](fun: InT => OutT): Function[InT, OutT] = new Function[InT, OutT] {
  override def apply(t: InT): OutT = fun(t)
}

def main(args: Array[String]): Unit = {
  Stream.of("a", "b", "c")
    .map[AbcTest](funToFunction((v: String) => AbcTest(v)))
    .collect(Collectors.toList())
}

它失败并显示以下错误消息:

    Error:(43, 27) type mismatch;
 found   : java.util.stream.Collector[Nothing,?0(in method main),java.util.List[Nothing]] where type ?0(in method main)
 required: java.util.stream.Collector[_ >: test.AbcTest, ?, ?]
Note: Nothing <: Any, but Java-defined trait Collector is invariant in type T.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
      .collect(Collectors.toList)

我不明白发生了什么,请帮忙。

【问题讨论】:

  • 我还不清楚“为什么”,但Stream.of("a", "b", "c").map[AbcTest](funToFunction((v: String)=&gt;AbcTest(v)) 似乎有效。类型推断似乎是个问题。
  • @GPI 正在测试这个,在我的编译器中,它说这缺少一个')',当我添加它时,我遇到了同样的问题......你的行为不同吗?跨度>
  • @jwismar 请重试,因为我从java.util.function.Function 中删除了java.util.function。我更新了答案。
  • @GPI 是的,这很重要。现在似乎可以工作了。
  • scala-java8-compat 库对于在 Scala 的函数类型和 Java 的函数类型之间进行转换很有用

标签: scala generics


【解决方案1】:

嗯...从我所看到的以下工作绝对可以,记得在某些类型推断中提供一点帮助

import java.util.{stream => jStream}
import java.util.{function => jFunction}

def funToFunction[InT, OutT](fun: InT => OutT): jFunction.Function[InT, OutT] =
  new jFunction.Function[InT, OutT] {
    override def apply(t: InT): OutT = fun(t)
  }

final case class AbcTest(value: String)

val javaList =
  jStream.Stream.of("a", "b")
    .map[AbcTest](funToFunction((s: String) => AbcTest(s)))
    .collect(jStream.Collectors.toList[AbcTest])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2016-08-19
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多