Как просмотреть вложенный список в необязательном? - PullRequest
2 голосов
/ 27 марта 2020

У меня есть объект node, у которого есть метод getNodes(), который возвращает список, и я хочу просмотреть этот список, только если node не null.

Я пытался сделать следующее, где я думал, что смогу отобразить поток списка и обойти его, но происходит то, что он пытается выполнить фильтр для объекта Stream, а не для содержимого списка.

public void updateNode(Node node) {
    List<Node> nodes = Optional.ofNullable(node)
                   .map(node -> Stream.of(node.getNodes))
                   .filter().......orElse()

    // operation on filtered nodes.
    ....

}

Ответы [ 3 ]

4 голосов
/ 27 марта 2020

Возможно, вам лучше использовать простое, если не нулевое утверждение, чем вводить необязательный. Это делает код более читабельным и снижает накладные расходы.

if (node != null) {
    node.getNodes().stream.filter(...
}

Кроме того, вы возвращаетесь из метода void.

3 голосов
/ 27 марта 2020

В худшем из вариантов реализации к правильному ответу здесь для проверки null доступны следующие альтернативы:

Optional.ofNullable(node)
        .map(Node::getNodes)
        .orElse(Collections.emptyList())
        .stream() // Stream of nodes
        .filter(...)

или с Java -9 +

Stream.ofNullable(node)
        .flatMap(nd -> nd.getNodes().stream())
        .filter(...)
1 голос
/ 27 марта 2020

В вашем коде:

 Optional.ofNullable(node).map(node -> Stream.of(node.getNodes))

Это создает поток одного элемента: самого списка узлов.

Stream.of(node.getNodes))

Вместо этого, чтобы получить поток узлы, где вы можете затем фильтровать узел, используйте:

node.getNodes().stream().filter(... 
...