【问题标题】:How to use java8 lambda and function in scala如何在scala中使用java8 lambda和函数
【发布时间】:2019-08-20 07:16:41
【问题描述】:

我有这样的代码:

public class A {

    private String id;
    //constructor, getter, setter

}

在java中我可以使用这个:

public class C {

    @Test
    public void t() {
        List<A> list = Arrays.asList(new A("1"));
        list.sort(Comparator.comparing(A::getId));
        Map<String, List<A>> map = list.stream().collect(Collectors.groupingBy(A::getId));
    }
}

这里是 scala(2.12) 测试:

class B {

  @Test
  def t(): Unit = {
    val list = util.Arrays.asList(new A("1"))
    list.sort(Comparator.comparing(a => a.getId))
    list.stream().collect(Collectors.groupingBy(a => a.getId))
  }

}

但在 scala 测试中,list.sort(Comparator.comparing(a =&gt; a.getId)) 会得到两个错误:

  1. 错误:(21, 26) 推断类型参数 [com.test.A,?0] 不符合方法比较的类型参数边界 [T,U <: comparable>: U]]

  2. 错误:(21, 38) 类型不匹配; 找到:java.util.function.Function[com.test.A,String] 必需:java.util.function.Function[_ >: T, _ <: u>

list.stream().collect(Collectors.groupingBy(a =&gt; a.getId)) 会得到这个错误:

  1. 错误:(22, 49) 缺少参数类型

我该如何使用它?

【问题讨论】:

  • list.sortBy(_.id).groupBy(_.id) 这有什么问题?
  • 我只考虑通过java.util.List的方式完成,但是groupBy之后如何转换成java.util.Map
  • 我希望你听说过 Decorate 包中的 javaConvertors,你会得到一个 asJava 方法,所以我会转换成 java Map
  • 是的,我知道,但是我觉得不方便进行多次转换。列表 -> asScala -> asJava ...
  • 1.提供准确的错误信息; 2. 你使用的是 Scala 2.12 吗? 3.你在Scala中使用的是ScalaList还是Java?

标签: scala java-8


【解决方案1】:

试试

import scala.compat.java8.FunctionConverters._

val list = util.Arrays.asList(new A("1"))
list.sort(Comparator.comparing[A, String](((a: A) => a.getId).asJava))
list.stream().collect(Collectors.groupingBy[A, String](a => a.getId))

libraryDependencies += "org.scala-lang.modules" %% "scala-java8-compat" % "0.9.0"

How to use Java lambdas in Scala

【讨论】:

  • 是的,它对我有用。而且我不知道为什么sort 需要asJavagroupingBy 不需要?
  • 通常在 2.12 中你不需要.asJava
  • 在这种情况下,编译器很困惑,我们提供了帮助。
  • 有点了解,非常感谢。
【解决方案2】:

一个班轮应该是这样的,按 id 对列表进行排序,然后按 id 分组,地图不是有序的数据结构,所以你的 id 的顺序可以是任何顺序。您可以做的是首先对它们进行分组,然后按键对 Map 进行排序,在这种情况下为 id。

case class A(id:String)
val list = List(A("1"), A("2"), A("4"), A("3"))
list.sortBy(_.id).groupBy(_.id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2014-10-20
    • 2021-08-13
    相关资源
    最近更新 更多