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的字符串
sMap
,在列表中,每个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()));