【问题标题】:How do I convert a for loop to a stream如何将 for 循环转换为流
【发布时间】:2017-02-09 03:45:46
【问题描述】:

我对流有所了解,并且知道可以使用它们来代替循环。对于这个玩具示例,我使用图形数据库来存储一组字符串。 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;
  }

【问题讨论】:

    标签: java-8 java-stream


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      请参阅此 SO 线程。 Convert Iterable to Stream using Java 8 JDK

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

      【讨论】:

        【解决方案3】:

        您需要将 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());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-28
          • 2018-03-19
          • 2023-04-01
          • 1970-01-01
          • 2021-02-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多