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