Назначить все значения в наборе <String>на картус потоками - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть список1, содержащий разные строки, которые начинаются со строки из другого списка (fooBarList).

List<String> list1 = Arrays.asList("FOO1234", "FOO1111", "BAR1", "BARRRRR");
List<String> fooBarList = Array.asList("FOO", "BAR");

Я хотел бы создать Hashmap<String, List<String>> hm, который отделяет строки от списка1 в зависимости от того, чтоони начинаются с.

Результат должен выглядеть следующим образом:

{FOO=["FOO1234",FOO1111"], BAR=["BAR1", "BARRRRR"]}

fooBarList определяет различные ключи.

как мне добиться этого с помощью потоков?Я просто не знаю, как сделать шаг, где я в основном говорю: FOO1234 начинается с FOO, поэтому проверьте, существует ли ключ FOO, и добавьте его в список, иначе создайте новый список.(Я полагаю, что мне нужно перебрать fooBarList внутри потока, что мне просто кажется неправильным)

/ edit: уверен, что в fooBarList только 2 значения, я мог бы сделать простые проверки, если строка начинается с "foo ", тогда сделай это, сделай это.Но что, если мой список содержит сотни строк.

1 Ответ

0 голосов
/ 14 февраля 2019

Простой Collectors::groupingBy должен сделать трюк:

Map<String, List<String>> prefixGrouping = list1.stream()
    .collect(
        Collectors.groupingBy(
            item -> fooBarList.stream().filter(item::startsWith).findFirst().orElse("")
        )
    );

Ввод: list1=["FOO1234", "FOO1111", "BAR1", "BARRRRR", "LOL"], fooBarList=["FOO", "BAR"]

Выход: {""=["LOL"], "BAR"=["BAR1", "BARRRRR"], "FOO"=["FOO1234", "FOO1111"]}


Вы ищете префикс в функции группировки, и если нет совпадения префиксов, он попадет в корзину emtpy String.

...