我有一个HashMap,我需要使用一些函数进行过滤:
HashMap<Set<Integer>, Double> container
Map.Entry<Set<Integer>, Double> map = container.entrySet()
.stream()
.filter(k -> k.getKey().size() == size)
对于size = 2,以下内容应该有效:
containerBeforeFilter = {1,2,3} -> 1.5, {1,2} -> 1.3
containerAfterFilter = {1,2} -> 1.3
在过滤器中应用函数后,我想再次将结果收集到HashMap中。但是,当我尝试应用建议的here方法时,我会收到非法声明。
因此,在过滤器之后应用的以下语句是非法的:
.collect(Collectors.toMap((entry) -> entry.getKey(), (entry) -> entry.getValue()));
收集未更改的地图值的正确方法是什么,唯一的标准是满足某些关键?
更新
上述代码中的错误是变量map
的类型。它应该是Map
而不是Map.Entry
。
所以功能代码是:
Map<Set<Integer>, Double> map = container.entrySet()
.stream()
.filter(k -> k.getKey().size() == size)
.collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue()));
答案 0 :(得分:7)
似乎Collectors.toMap
在您的示例中没有获取stream.collect
的类型参数,只返回Map<Object,Object>
。
作为一种变通方法,您可以自己创建结果映射,并在最后一个流步骤中将过滤后的条目添加到结果映射中:
Map<Set<Integer>, Double> result = new HashMap<>();
container.entrySet()
.stream()
.filter(entry -> entry.getKey().size() == size)
.forEach(entry -> result.put(entry.getKey(), entry.getValue()));
答案 1 :(得分:6)
使用
有更好的解决方案toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier)
您可以这样使用它:
HashMap<Set<Integer>, Double> map = container.entrySet()
.stream()
.filter(k -> k.getKey().size() == size)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (prev, next) -> next, HashMap::new));