2017-03-16 12 views
0

Scalaでjava.util.HashSetを慣用的に反復する方法を知りました。現在、私は素晴らしいとは思わないwhileループでJavaイテレータを使用しています。scala iterate 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を使用しているので、この最初の操作を行います。これは、あなたがasScalaを使用して、で作業する方がはるかに簡単ですScalaのコレクションの中にJavaコレクションを回すことができます

import scala.collection.JavaConverters._ 

を。 FYI

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

または何でもあなたがfilterfoldLeftのようにやってみたい、など

、上記の例することができます

あなたはsetと呼ばれるHashSetのインスタンスを持っているのであれば、あなたはこれを行うことができます文法的にこれに近づく:

set.asScala.map(doSomething) 
+0

私は見る。しかし、これは実際に効率的でしょうか?スパーク・ジョブのmapPartitionsメソッドでこのメソッドを呼び出す必要があるため、不要なオブジェクトを作成しないことをお勧めします。 –

+1

これはあなたの心配ではありません。スパークジョブを実行する際の心配は、ネットワークシャッフルトラフィックを最小限に抑え、ガベージコレクションをチューニングすることです。また、証明されていない問題の解決策を探す時間を費やしています。 [時期尚早な最適化は、プログラミングにおけるすべての悪(または少なくともそのほとんど)の根源です。](https://en.wikiquote.org/wiki/Donald_Knuth) – Vidya