如何在Scala中使用Java8 Lambda和函数

时间:2019-03-29 10:54:55

标签: scala java-8

我有这样的代码:

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 => a.getId))将出现两个错误:

  1. 错误:(21,26)推断的类型参数[com.test.A,?0]不符合方法比较的类型参数范围[T,U <:Comparable [_>:U]] < / p>

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

list.stream().collect(Collectors.groupingBy(a => a.getId))将收到此错误:

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

我如何使用它?

2 个答案:

答案 0 :(得分:2)

一个内衬应该是这样的,以便按ID对列表进行排序,然后按ID对它们进行分组,因为地图不是有序的数据结构,所以ID的顺序可以是任何顺序。您可以做的是先将它们分组,然后再按ID(在这种情况下为id)对Map进行排序。

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

答案 1 :(得分:2)

尝试

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