我有一个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个字符串,该怎么办。
答案 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
箱中。