使用流将Set <string>中的所有值分配给Map <string,string =“”>

时间:2019-02-14 12:40:44

标签: java java-8 java-stream

我有一个list1,其中包含不同的字符串,这些字符串以另一个列表(fooBarList)中的字符串开头。

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

我想创建一个Hashmap<String, List<String>> hm,根据字符串的开头将其与list1分开。

结果应如下所示:

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

fooBarList定义了不同的键。

我如何在流的帮助下实现这一目标?我只是不知道该怎么做,基本上就是说:FOO1234以FOO开头,因此请检查键FOO是否存在并将其添加到列表中,否则创建一个新列表。 (我想我必须遍历流中的fooBarList,这对我来说似乎是错误的)

/ edit:确保在fooBarList中只有2个值,我可以简单地检查字符串是否以“ foo”开头,然后执行其他操作。但是,如果我的列表包含100个字符串,该怎么办。

1 个答案:

答案 0 :(得分:10)

一个简单的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"]}

     

您正在分组功能中查找前缀,如果没有前缀匹配,则它将进入空String箱中。