2016-09-30 158 views
2

我已經瞭解了一些關於流的知識並知道它們可以用來代替循環。對於這個玩具的例子,我使用圖形數據庫來存儲一組字符串。 dB將它們存儲爲頂點。我想檢索這些頂點並將它們轉換爲字符串,而不是使用流。每個頂點都有一組屬性;我給它一個鍵,它返回一個值。如果一個頂點有我正在尋找的屬性,我將它添加到列表中。如果它不存儲頂點iD。如何將for循環轉換爲流

我有一個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()); 
0

您需要Iterables轉變爲甲流,要做到這一點,你可以leveragae 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());