Как использовать java8 lambda и функцию в Scala - PullRequest
3 голосов
/ 29 марта 2019

У меня есть такой код:

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]]

  2. Ошибка: (21, 38) несоответствие типов;найдено: java.util.function.Function [com.test.A, String] требуется: java.util.function.Function [_>: T, _ <: U] </p>

и list.stream().collect(Collectors.groupingBy(a => a.getId)) получит эту ошибку:

  1. Ошибка: (22, 49) отсутствует тип параметра

Как его использовать?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Попробуйте

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"

Как использовать Java-лямбды в Scala

2 голосов
/ 29 марта 2019

Один лайнер должен быть примерно таким, чтобы отсортировать список по идентификатору, а затем сгруппировать их по идентификатору, карта не является упорядоченной структурой данных, поэтому порядок ваших идентификаторов может быть в любом порядке.Что вы можете сделать, это сначала сгруппировать их, а затем отсортировать Map по ключу, который в данном случае является id.

case class A(id:String)
val list = List(A("1"), A("2"), A("4"), A("3"))
list.sortBy(_.id).groupBy(_.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...