如何通过值集合流式传输?

Prp*_*paa 2 java collections java-8 java-stream

如何流式传输Map<String, List<String>>获取:

  1. List<String>所有的String的值s List的第Map它们比5个字符?如何长期计算这些?

  2. Map<String, List<String>>其中密钥保持不变,但List小号仅由String长度大于5号第?

  3. A 在每张地图的密钥中有多于5的Map<String, Long>计数?StringList

我开始做的事情但我被困住了:

long l = map.entrySet().stream()
            .filter(m -> m.getValue().stream().filter(s -> s.length() > 5)
Run Code Online (Sandbox Code Playgroud)

谢谢

Era*_*ran 5

对于第一个问题,您可以合并使用Lists flatMap,然后过滤短Strings:

List<String> longStrings = 
    map.values()
       .stream()
       .flatMap(Collection::stream)
       .filter(s->s.length() > 5)
       .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

对于第二个问题,看起来您想要Map从源创建一个新的Map,其中键保持不变并且值被过滤:

样本输入:

Map<String, List<String>> map = new HashMap<> ();
map.put ("one", Arrays.asList (new String[]{"1","2","12345","123456"}));
map.put ("two", Arrays.asList (new String[]{"1","123456","12345","12"}));
map.put ("three", Arrays.asList (new String[]{"1","2","12","34"}));
map.put ("four", Arrays.asList (new String[]{"12345","123456","1234567","123"}));
Run Code Online (Sandbox Code Playgroud)

处理:

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())));
Run Code Online (Sandbox Code Playgroud)

输出:

{four=[123456, 1234567], one=[123456], three=[], two=[123456]}
Run Code Online (Sandbox Code Playgroud)

第三个问题是第二个问题的一个小变化:

Map<String, Long> output =
    map.entrySet()
       .stream()
       .collect(Collectors.toMap(Map.Entry::getKey,
                                 e->e.getValue()
                                     .stream()
                                     .filter(s -> s.length() > 5)
                                     .count()));
Run Code Online (Sandbox Code Playgroud)

  • 如果源`Map`是可变的并且不需要旧状态,则任务`2`可以作为就地操作完成:`map.values().forEach(list - > list.removeIf(s - > s. length()<= 5));` (2认同)