scala перебирает java hashSet

Интересно, как идиоматически повторить java.util.HashSet в Scala. В настоящее время я использую итераторы java в цикле while, который не кажется отличным.

Кроме того, мне интересно, эффективен ли изменяемый расширяемый буфер или есть ли возможность избежать создания ненужных объектов.

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: эффективное использование mapPartitions в Java


person Georg Heiler    schedule 16.03.2017    source источник


Ответы (1)


Поскольку вы используете Java HashSet, по-видимому, сначала сделайте это:

import scala.collection.JavaConverters._

Это позволяет вам превращать коллекции Java в коллекции Scala, с которыми гораздо проще работать, используя asScala.

Итак, если у вас есть экземпляр HashSet с именем set, вы можете сделать это:

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

Или все, что вы хотите сделать, например filter, foldLeft и т. д.

К вашему сведению, приведенный выше пример может быть синтаксически подслащен к этому:

set.asScala.map(doSomething)
person Vidya    schedule 16.03.2017
comment
Я понимаю. Но будет ли это на самом деле эффективным? Поскольку мне нужно вызвать этот метод в методе mapPartitions искрового задания, я бы не хотел создавать ненужные объекты. - person Georg Heiler; 17.03.2017
comment
Это не должно быть вашей заботой. Ваша забота при выполнении задания Spark должна заключаться в минимизации трафика перетасовки сети и настройке сборки мусора. Кроме того, вы тратите время на поиск решения проблемы, существование которой вы не доказали. Преждевременная оптимизация — корень всех зол (или, по крайней мере, большей их части) в программировании. - person Vidya; 17.03.2017