如何将 for 循环转换为流

Posted

技术标签:

【中文标题】如何将 for 循环转换为流【英文标题】:How do I convert a for loop to a stream 【发布时间】: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;
  

【问题讨论】:

【参考方案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());

【讨论】:

以上是关于如何将 for 循环转换为流的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 将数据库中的 base64 值转换为流

将 lisp 字符串转换为流

在Java 8中将while循环转换为流

将 XDocument 转换为流

如何将for循环转换为map函数

如何将此代码转换为 for 循环格式?