如何在 Scala 中移植 java 内部函数?

how to port java inner function in Scala?

如何从 here 移植 java 内部函数 哪个完全包含在 Scala 中?

JavaPairRDD<Envelope, HashSet<Point>> castedResult = joinListResultAfterAggregation.mapValues(new Function<HashSet<Geometry>,HashSet<Point>>()
            {
                @Override
                public HashSet<Point> call(HashSet<Geometry> spatialObjects) throws Exception {
                    HashSet<Point> castedSpatialObjects = new HashSet<Point>();
                    Iterator spatialObjectIterator = spatialObjects.iterator();
                    while(spatialObjectIterator.hasNext())
                    {
                        castedSpatialObjects.add((Point)spatialObjectIterator.next());
                    }
                    return castedSpatialObjects;
                }

            });
            return castedResult;

由于某些 NotinferredU

,我下面概述的方法无法编译
val castedResult = joinListResultAfterAggregation.mapValues(new Function[java.util.HashSet[Geometry], java.util.HashSet[Point]]() {
    def call(spatialObjects: java.util.HashSet[Geometry]): java.util.HashSet[Point] = {
      val castedSpatialObjects = new java.util.HashSet[Point]
      val spatialObjectIterator = spatialObjects.iterator
      while (spatialObjectIterator.hasNext) castedSpatialObjects.add(spatialObjectIterator.next.asInstanceOf[Point])
      castedSpatialObjects
    }
  })

这个怎么样?

val castedResult = joinListResultAfterAggregation.mapValues(spatialObjects => {
                        spatialObjects.map(obj => (Point) obj)
                   })

当询问有关编译错误的问题时,请提供确切的错误,尤其是当您的代码不能独立存在时。

内部函数本身没问题;我的猜测是,由于上述变化 joinListResultAfterAggregation 不再是 JavaPairRDD,而是正常的 RDD[(Envelope, Something)](其中 Something 可能是 java.util.HashSetscala.collection.Set 或某些子类型),因此它的 mapValues 采用 Scala 函数,而不是 org.apache.spark.api.java.function.Function。 Scala 函数被写成 lambdas:spatialObjects: Something => ...(主体将取决于 Something 实际是什么,并且在某些情况下可以省略参数类型)。