如何将for循环转换为流

时间:2016-09-30 14:16:29

标签: java-8 java-stream

我已经了解了一些关于流的知识,并且知道它们可以用来代替循环。对于这个玩具示例,我使用图形数据库来存储一组字符串。 dB将它们存储为顶点。我想检索这些顶点并使用流将它们转换为字符串。每个顶点都有一组属性;我给它一个键,它返回一个值。如果顶点具有我正在寻找的属性,我将其添加到列表中。如果不是,我存储顶点iD。

我有一个for循环,但我不知道如何使用流。这是代码:

public List<String> getItems() throws Exception {
    Iterable<Vertex> myNodes = graph.getVertices();

    List<String> myItems = new ArrayList<>();

    // maybe there is a way to use stream API instead?
    for(Vertex v : myNodes)
    {
      String value = v.getId().toString();
      if(v.getPropertyKeys().contains(key))
      {
         value = v.getProperty(key);
      }

      myItems.add(value);
    }

    return myItems;
  }

3 个答案:

答案 0 :(得分:1)

正如Sagar Rohankar在他的回答中指出的那样,您需要从Spliterator获取Iterable。然后你的任务是一个简单的单行:

return StreamSupport.stream(graph.getVertices().spliterator(), false)
    .map(v -> v.getPropertyKeys().contains(key) ? v.getProperty(key) : v.getId().toString())
    .collect(Collectors.toList());

答案 1 :(得分:0)

请看这个SO线程。 Convert Iterable to Stream using Java 8 JDK

简而言之,您必须使用StreamSupport#stream,传递spliterator,然后使用map将其转换为字符串。

答案 2 :(得分:0)

您需要将Iterables转换为Stream,为此,您可以将这些内容转换为StreamSupport。

这篇文章有一个很好的解释 Why does Iterable<T> not provide stream() and parallelStream() methods?

您可以使用以下内容:

StreamSupport.stream(graph.getVertices().spliterator(),false)
    .map(g -> g.getProperty(key))
    .collect(Collectors.toList());