Использование строкового потока в качестве результата разделения в лямбде - PullRequest
0 голосов
/ 30 мая 2020

Мне нужно разделить строку на основе запятой и добавить ее к Map одновременно в одну go. Я знаю, что могу собрать разделенный поток в список, а затем перебрать список для того же эффекта. Но мне нужно знать, можно ли это сделать.

Input: List<String> - (A, B) (A, C)

Output: Map<String, List<String>> - (A, (B, C))

Пример кода: (содержит ошибку)

public void edgeListRepresentation(ArrayList<String> edges){
        Map<String, List<String>> edgeList = new HashMap<>();
        edges.forEach(connection -> {

            Stream.of(connection.split(","))
                    .map((arr) -> {
                        edgeList.computeIfAbsent(arr[0], val -> new ArrayList<String>()).add(arr[1]);
                    });
        });

    }

     public static void main(String[] args) throws IOException {
        EdgeList edgeList = new EdgeList();
        edgeList.edgeListRepresentation(new ArrayList<String>(){
            {
                add("A, B");
                add("A, C");
                add("A, E");
                add("B, C");
                add("C, E");
                add("C, D");
                add("D, E");
            }
        });
    }

Ответы [ 2 ]

3 голосов
/ 30 мая 2020

Вы можете решить вашу проблему, используя map + groupBy + mapping . Разделите все свои строки запятыми и поместите результат в общий Список кортежей. В конце просто примените сборщик groupBy и отображение, чтобы получить только значение из кортежа. Например:

new ArrayList<String>() {
    {
        add("A, B");
        add("A, C");
        add("A, E");
        add("B, C");
        add("C, E");
        add("C, D");
        add("D, E");
    }
}.stream()
    .map(line -> line.split(","))
    .collect(Collectors.groupingBy(
        tuple -> tuple[0],
        Collectors.mapping(
            tuple -> tuple[1].trim(),
            Collectors.toList())
    ))

Вывод: {A=[B, C, E], B=[C], C=[E, D], D=[E]}

2 голосов
/ 30 мая 2020

Если вы хотите сделать это по-своему просто, не нужно использовать поток

edges.forEach(connection -> {
  String[] arr = connection.split(",");
  edgeList.computeIfAbsent(arr[0], val -> new ArrayList<String>()).add(arr[1].trim());
});
...