Самый идиоматичный способ перебора и добавления функционально

Я использую Гремлин, чтобы перебрать 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,

Другие вопросы по тегам