2

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 である必要がありますが、私が書くnew java.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)]
4

1 に答える 1

3

Java ラムダは、任意の関数型インターフェースの「実装者」です (この特定のケースでは、Collectors.groupingBy()を受け入れますjava.util.function.Function。ただし、Scala 匿名関数は、トレイトを実装する何らかのクラスのインスタンスですscala.FunctionX。したがって、任意の関数型インターフェースに Scala 関数を使用することはできません (ただし、私が知る限り、それを許してください)。

java.util.function.Function明示的に拡張する匿名クラスを作成する必要があります。

Collectors.groupingBy(new java.util.function.Function[Re, ???] {
  def apply(r: Re) = r.pName
})

pName(もちろん、 の代わりに の正しいタイプを入力する必要があります???)。

T => Uこれを頻繁に行う場合は、Scala のtoの暗黙的な変換を定義できます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)。

暗黙的なアダプターを使用したバリアントは見栄えが良くなります (ただし、明示的な型注釈が必要です)。

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
于 2015-02-19T15:41:29.910 に答える