Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java scala的Collector.groupingBy()的替代品_Java_Scala_Collectors - Fatal编程技术网

Java scala的Collector.groupingBy()的替代品

Java scala的Collector.groupingBy()的替代品,java,scala,collectors,Java,Scala,Collectors,在Java中,我有如下内容: Collectors.groupingBy((Re r) -> return r.pName) 它工作正常。现在,我正在尝试将同样的东西引入scala,比如: Collectors.groupingBy((r:Re) => return r.pName) 但后来我得到了这样的东西 cannot resolve reference groupingBy with such signature cannot resolve symbol grouping

在Java中,我有如下内容:

Collectors.groupingBy((Re r) -> return r.pName)
它工作正常。现在,我正在尝试将同样的东西引入scala,比如:

Collectors.groupingBy((r:Re) => return r.pName)
但后来我得到了这样的东西

cannot resolve reference groupingBy with such signature
cannot resolve symbol groupingBy

unspecified value parameters Collector
unspecified value parameters Supplier
如果您需要更多信息/代码,请告诉我,我将创建一些虚拟示例,因为我不允许发布确切的代码

根据@Vladimir Matveev的回答更新

pName应该是String,但如果我编写
newjava.util.function.function[Re,java.lang.String]
则会得到一个

type mismatch;
 found   : java.util.function.Function[Re,String]
 required: java.util.function.Function[_ >: Re, _ <: ?0(in value x$1)(in value x$1)(in value x$1)(in value x$1)]
类型不匹配;
找到:java.util.function.function[Re,String]
必需:java.util.function.function[>:Re,p>java lambda是任意函数接口的“实现者”(在本例中为
collector.groupingBy())
接受
java.util.function.function
。然而,Scala匿名函数是实现
Scala.FunctionX
trait的某些类的实例。因此,您不能将Scala函数用于任意函数接口(但据我所知,计划允许这样做)

您需要创建一个匿名类,显式扩展
java.util.function.function

Collectors.groupingBy(new java.util.function.Function[Re, ???] {
  def apply(r: Re) = r.pName
})
(当然,您需要输入正确类型的
pName
,而不是

如果您经常这样做,您可以定义Scala的
T=>U
java.util.function.function[T,U]
的隐式转换:

implicit class FunctionWrapper[T, U](f: T => U) extends java.util.function.Function[T, U] {
  def apply(x: T): U = f(x)
}
然后(假定此隐式在范围内),您可以像最初尝试的那样使用它:

Collectors.groupingBy((r: Re) => r.pName)
更新我不知道为什么会发生错误(可能是因为Scala和Java泛型之间存在一些不兼容),但是如果您明确指定所有类型,它确实会起作用:

scala> Collectors.groupingBy[Re, String](new JFunction[Re, String] {
     |   def apply(r: Re) = r.pName
     | })
res2: java.util.stream.Collector[Re, _, java.util.Map[String,java.util.List[Re]]] = java.util.stream.Collectors$CollectorImpl@4f83df68
JFunction
java.util.function.function
的别名)

带有隐式适配器的变量看起来更好(但仍然需要显式类型注释):


发现问题,分组后需要[Re,java.lang.String]我的意思是你的更新很有用,而不是我自己发现的:D
scala> Collectors.groupingBy[Re, String]((r: Re) => r.pName)
res4: java.util.stream.Collector[Re, _, java.util.Map[String,java.util.List[Re]]] = java.util.stream.Collectors$CollectorImpl@71075444