如何将 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 循环转换为流的主要内容,如果未能解决你的问题,请参考以下文章