Как сделать 3-х стороннюю фильтрацию / Группирование по потокам Java - PullRequest
0 голосов
/ 24 июня 2018

У меня есть представление списка Java, как показано ниже

Представление списка данных

[
    { "type" : "Error", "name" : "xyz" },
    { "type" : "Success", "name" : "abc" },
    { "type" : "none", "name" : "prq" },
    { "type" : "Success", "name" : "" },
    { "type" : "Success", "name" : "xyz" },
    { "type" : "Warning", "name" : "efc" }
    .
    .
    .
]

(Частичное представление здесь).и представление объекта ниже

public Node {
    List<String> errorNames;
    List<String> SuccessNames;
    List<String> WarningNames;
    }

Я хочу использовать потоки Java для разделения трех типов имен на основе их типа и добавления каждого имени в соответствующие списки.

Что будетлучший способ (Stream.filter / Collect / Map что-нибудь еще) разделить список таким образом, чтобы в конце " Node's -> (все списки) " имелись соответствующие данные?

1 Ответ

0 голосов
/ 24 июня 2018

Предполагая, что ваш класс Node на самом деле выглядит примерно так:

public class Node {
    private String type;
    private String name;

    public Node(String type, String name) {
        this.type = type;
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public String getName() {
        return name;
    }
}

Вы можете использовать Collectors#groupingBy в сочетании с Collectors#mapping, чтобы создать Map<String, List<String>>, где их ключом является typeи значение равно List из name для каждого Node этого type:

var nodes = List.of(
    new Node("Error", "xyz"), new Node("Success", "abc"),
    new Node("none", "prq"), new Node("Success", ""),
    new Node("Success", "xyz"), new Node("Warning", "efc")
);

var map = nodes.stream()
               .collect(Collectors.groupingBy(Node::getType,
                        Collectors.mapping(Node::getName, Collectors.toList())));

System.out.println(map);

Выход:

{Warning=[efc], Error=[xyz], none=[prq], Success=[abc, , xyz]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...