如何流式传输 Map<String, List<String>>
得到:
A
List<String>
所有String
值List
的 sMap
的 s哪些长度超过 5 个字符?如何获得这些的长数?A
Map<String, List<String>>
其中键保持不变,但List
s 仅包含String
s 的长度大于 5?A
Map<String, Long>
计数为String
s 长于List
中的 5每个 map 的键?
我开始了一些事情,但我被困住了:
long l = map.entrySet().stream()
.filter(m -> m.getValue().stream().filter(s -> s.length() > 5)
谢谢
最佳答案
对于第一个问题,您可以使用 flatMap
合并 List
,然后过滤掉短的 String
:
List<String> longStrings =
map.values()
.stream()
.flatMap(Collection::stream)
.filter(s->s.length() > 5)
.collect(Collectors.toList());
对于第二个问题,您似乎想从源 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"}));
处理:
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())));
输出:
{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()));
关于java - 如何按集合的值流式传输 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40151350/