Самый идиоматичный способ перебора и добавления функционально
Я использую Гремлин, чтобы перебрать GraphTraversal
Объект и получить вершины.
Вот с чем я работаю:
def getVertexSet(vIter: GraphTraversal[Vertex, Vertex]): Set[Vertex] = {
val s = mutable.HashSet.empty[Vertex]
vIter.forEachRemaining(v => s.add(v))
s.toSet
}
Я хотел бы иметь возможность сделать это без преобразования изменяемой коллекции в неизменяемую коллекцию. Я не знаю, возможно ли это с итератором. Вероятно, для этого в Scala используется хвостовая рекурсия, но я не уверен, что в этом есть какое-то преимущество с точки зрения производительности, и в этот момент единичное преобразование в неизменяемое в конце, вероятно, в любом случае будет более читабельным.
Кроме того, если есть лучший способ собрать все вершины из обхода, я тоже открыт для этой оптимизации.
1 ответ
Если вы в порядке с использованием Scala's Set
вместо Java используйте:
import collection.JavaConverters._
def getVertexSet(vIter: GraphTraversal[Vertex, Vertex]): Set[Vertex] = {
vIter.asInstanceOf[java.util.Iterator[Vertex]].asScala.toSet
}
Вы все еще можете позвонить .asJava
на Set[Vertex]
позже, если вам действительно нужна Java Set
,