将set转换为带有count的字符串映射

时间:2017-07-07 21:34:35

标签: java lambda java-8 java-stream

我的原始数据是像

这样的字符串流
correctname
abc,def,ghi,jol
abc
def,ghi
zzzzzzzzzz
myname
pppppppppp
jkl

转换它设置:

{correct}
{abc, def,ghi,jkl}
{abc}
{def,ghi}
{invalid}
{correct}
{invalid}
{jkl}

我有一些Stream.map(...)让我回到结果

Map<String,Long> answer = Stream.map(...).collect(groupingby??)

现在我想收集它(收集或映射或分组)并将结果作为Map返回,以便我的回答应该是

地图&GT; {正确:2 无效:2 其他人:8}

2 个答案:

答案 0 :(得分:4)

这里的诀窍是flatMap每个都设置为其中的字符串。完成后,您可以使用map将值转换为您感兴趣的值并对其进行计数。 E.g:

Set<String> allowed = new HashSet<>(Arrays.asList("correct", "invalid"));
Map<String, Long> result = 
    values.flatMap(Set::stream)
          .map(s -> allowed.contains(s) ? s : "other")
          .collect(Collectors.groupingBy(Function.identity(), 
                                         Collectors.counting()));

答案 1 :(得分:2)

听起来你正在寻找这个:

Map<String, Long> answer = sets.stream()
        .flatMap(Set::stream)
        .collect(Collectors.groupingBy(
                s -> s.matches("invalid|correct") ? s : "others",
                Collectors.counting()));