2017-03-16 93 views
0

我想知道如何在Scala中惯用地迭代java.util.HashSet。目前,我在while循环中使用java迭代器,这看起来不太好。scala迭代java hashSet

此外,我想知道可变长的缓冲区是否有效,或者是否有可能避免创建不必要的对象。

import java.util 

import scala.collection.generic.Growable 
import scala.collection.mutable 

val javaSet = new util.HashSet[String]() 
javaSet.add("first") 
javaSet.add("second") 

val result: collection.Seq[String] with Growable[String] = mutable.Buffer[String]() 
val itr = javaSet.iterator 

while (itr.hasNext) { 
    result += itr.next 
} 

result 

编辑

会一stream更好吗? Apache Spark: Effectively using mapPartitions in Java

回答

3

由于您使用Java HashSet显然,这样做第一:

import scala.collection.JavaConverters._ 

这可以让你把Java集合到Scala集合,这是很容易的工作,使用asScala

所以,如果你有一个名为setHashSet一个实例,你可以这样做:

set.asScala.map(value => doSomething(value)) 

或任何你想要做像filterfoldLeft

仅供参考,上面的例子可以被语法加糖到:

set.asScala.map(doSomething) 
+0

我明白了。但是这实际上会有效吗?因为我需要在Spark任务的mapPartitions方法中调用此方法,所以我不想创建不必要的对象。 –

+1

这不应该是你的关注。运行Spark作业时,您应该尽可能减少网络洗牌流量并优化垃圾收集。此外,您花时间寻找解决方案来解决您尚未证实存在的问题。 [过早优化是编程中所有邪恶(或至少大部分)的根源。](https://en.wikiquote.org/wiki/Donald_Knuth) – Vidya