2017-03-21 27 views
0

如何將一個內部函數從here 中完全包含到Scala中?如何在Scala中移植java內部函數?

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 
    } 
    }) 

回答

1

當提出有關編譯錯誤的問題時,請提供確切的錯誤,特別是當您的代碼不能獨立運行時。

內部函數本身很好;我的猜測是,由於上述joinListResultAfterAggregation變化不是JavaPairRDD了,但一個正常的RDD[(Envelope, Something)](其中Something可能是java.util.HashSetscala.collection.Set或某些亞型),所以其mapValues需要Scala的功能,而不是一個org.apache.spark.api.java.function.Function。 Scala函數寫成lambda表達式:spatialObjects: Something => ...(正文取決於Something實際是什麼,在某些情況下可以省略參數類型)。

1

這個怎麼樣?

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