Java 如何通过集合的值来流化地图?

Java 如何通过集合的值来流化地图?,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,如何流式处理映射以获取: 值列表的字符串的列表长度超过5个字符的映射的列表?如何得到这些长计数 一个映射其中键保持不变,但是列表s只包含长度大于5的字符串s 一个Map,在列表中,每个Map的键的字符串的计数大于5 我开始做一些事情,但我被卡住了: long l = map.entrySet().stream() .filter(m -> m.getValue().stream().filter(s -> s.length() > 5) 感谢第一个问题

如何流式处理
映射
以获取:

  • 列表的
    字符串的
    列表
    长度超过5个字符的
    映射
    列表
    ?如何得到这些长计数

  • 一个
    映射
    其中键保持不变,但是
    列表
    s只包含长度大于5的
    字符串
    s

  • 一个
    Map
    ,在
    列表中,每个Map的键的
    字符串的计数大于5

  • 我开始做一些事情,但我被卡住了:

    long l = map.entrySet().stream()
                .filter(m -> m.getValue().stream().filter(s -> s.length() > 5)
    

    感谢第一个问题,您可以使用
    flatMap
    合并
    列表
    s,然后过滤掉短
    字符串
    s:

    List<String> longStrings = 
        map.values()
           .stream()
           .flatMap(Collection::stream)
           .filter(s->s.length() > 5)
           .collect(Collectors.toList());
    
    处理:

    Map<String, List<String>> output =
        map.entrySet()
           .stream()
           .collect(Collectors.toMap(Map.Entry::getKey,
                                     e->e.getValue()
                                         .stream()
                                         .filter(s -> s.length() > 5)
                                         .collect(Collectors.toList())));
    
    第三个问题是第二个问题的一个小变化:

    Map<String, Long> output =
        map.entrySet()
           .stream()
           .collect(Collectors.toMap(Map.Entry::getKey,
                                     e->e.getValue()
                                         .stream()
                                         .filter(s -> s.length() > 5)
                                         .count()));
    
    映射输出=
    map.entrySet()
    .stream()
    .collect(Collectors.toMap(Map.Entry::getKey、,
    e->e.getValue()
    .stream()
    .filter(s->s.length()>5)
    .count());
    
    谢谢。在第一个问题中,我想得到所有字符串都大于5的列表,不管键是什么。在第二个示例中,我需要映射,正如您在第一个示例中所做的一样,在第三个示例中,我需要映射,但使用计数而不是列表作为值。谢谢again@Prpaa编辑以回答第一个问题。如果源
    Map
    是可变的,并且旧状态不是必需的,则任务
    2
    可以作为就地操作完成:
    Map.values().forEach(list->list.removeIf(s->s.length())否则,Java 9将为此类任务提供必要的内置收集器,即任务2的
    .collect(groupingBy(Map.Entry::getKey,flatMapping(e->e.getValue().stream(),filtering(s->s.length()>5,toList()))
    (获得一点LISP的感觉),通过替换
    toList()可以轻松地适应任务3
    计数()…
    
    {four=[123456, 1234567], one=[123456], three=[], two=[123456]}
    
    Map<String, Long> output =
        map.entrySet()
           .stream()
           .collect(Collectors.toMap(Map.Entry::getKey,
                                     e->e.getValue()
                                         .stream()
                                         .filter(s -> s.length() > 5)
                                         .count()));