首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala的Collectors.groupingBy()替代方案

scala的Collectors.groupingBy()替代方案
EN

Stack Overflow用户
提问于 2015-02-19 15:13:13
回答 1查看 712关注 0票数 2

在Java中,我有如下内容:

代码语言:javascript
复制
Collectors.groupingBy((Re r) -> return r.pName)

而且工作正常。现在,我试图在scala中得到同样的东西,比如:

代码语言:javascript
复制
Collectors.groupingBy((r:Re) => return r.pName)

但后来我得到了一些东西

代码语言:javascript
复制
cannot resolve reference groupingBy with such signature
cannot resolve symbol groupingBy

unspecified value parameters Collector
unspecified value parameters Supplier

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

基于@Vladimir答复的更新

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

代码语言:javascript
复制
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)]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-19 15:41:29

Java是任意函数接口的“实现者”(在这种情况下,Collectors.groupingBy()接受java.util.function.Function。然而,Scala匿名函数是一些实现scala.FunctionX特性的类的实例。因此,您不能将Scala函数用于任意函数接口(但据我所知,有计划允许使用Scala函数)。

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

代码语言:javascript
复制
Collectors.groupingBy(new java.util.function.Function[Re, ???] {
  def apply(r: Re) = r.pName
})

(当然,您需要放置正确类型的pName而不是??? )。

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

代码语言:javascript
复制
implicit class FunctionWrapper[T, U](f: T => U) extends java.util.function.Function[T, U] {
  def apply(x: T): U = f(x)
}

然后(考虑到这个隐式在作用域内),您可以像最初尝试的那样使用它:

代码语言:javascript
复制
Collectors.groupingBy((r: Re) => r.pName)

更新我不知道为什么会发生错误(可能是因为Scala和泛型之间有些不兼容),但是如果您显式地指定了所有类型,它就会起作用:

代码语言:javascript
复制
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

(JFunctionjava.util.function.Function的别名)。

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

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28609848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档