2016-09-30 2 views
2

Я немного узнал о потоках и знаю, что они могут использоваться вместо циклов. Для этого примера игрушек я использую базу данных графа для хранения набора строк. ДБ сохраняет их как вершины. Я бы хотел получить эти вершины и преобразовать их в Strings, используя поток. Каждая вершина имеет набор свойств; Я даю ему ключ, и он возвращает значение. Если у вершины есть свойство, которое я ищу, я добавляю его в список. Если он не хранит вершину 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, вы должны получить Spliterator от Iterable. Тогда ваша задача простая однострочник:

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

См. Эту нить. Convert Iterable to Stream using Java 8 JDK

Короче говоря, вы должны использовать StreamSupport#stream, передавая spliterator, а затем использовать map, чтобы преобразовать его в строку.

0

Вы должны преобразовать итерируемыми в поток, чтобы сделать это, вы можете 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()); 
Смежные вопросы