当前位置:  开发笔记 > 编程语言 > 正文

如何使用peek()和filter()java8?

如何解决《如何使用peek()和filter()java8?》经验,为你挑选了1个好方法。

我有一个LinkedHashMap.

sorted:{0=[1, 2], 5=[4, 3], 1=[2, 0, 3], 2=[4, 0, 1], 3=[4, 5, 1], 4=[5, 2, 3]}

我尝试根据每个键的大小过滤每个键的值.例如,对于条目2=[4, 0, 1],我需要过滤值,使得键只应具有大小大于或等于(>=)的值

考虑一下2=[4, 1]:因为0只有两个元素,我们将其删除.4和1有三个元素,大小等于2,所以我们保留它.

最终输出应该是:

nodes_withHighDegreee :{0=[1, 2], 5=[4, 3], 1=[2, 3], 2=[4, 1], 3=[4, 1], 4=[2, 3]}

我试过了 :

Map> nodes_withHighDegree = sorted.entrySet().stream()
                .peek(e -> e.getValue().filter((a,b)-> map.get(a).size() >= map.get(b).size()))
                .collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), (m0, m1) -> m0.putAll(m1));
System.out.println("After sort" + nodes_withHighDegree);

如何在这里使用过滤功能?



1> Tunaki..:

你可以很简单地使用它Map.replaceAll.假设数据在LinkedHashMap被调用的内部sorted:

Map> filtered = new LinkedHashMap<>(sorted);
filtered.replaceAll((k, v) -> v.stream()
                               .filter(i -> sorted.get(i).size() >= v.size())
                               .collect(Collectors.toList()));

输出:

{0=[1, 2], 5=[4, 3], 1=[2, 3], 2=[4, 1], 3=[4, 1], 4=[2, 3]}

此代码创建映射的副本以保存已过滤的实例.然后它通过过滤它来替换每个值,并且只保留计数具有比当前计数更大值的整数.


在您当前的方法中,您正在使用peek修改值,这是一种不好的做法.引用其API说明:

此方法主要用于支持调试,您希望在元素流经管道中的某个点时查看这些元素.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有