【发布时间】:2021-05-08 22:15:03
【问题描述】:
我有一个包含 1000 个项目的 Map,我想从这个 Map 的前 500 个项目中生成一个 List,并删除从 Map 收集的项目。
换句话说,我想过滤、收集到List 并从Map 中删除项目。
我正在尝试这样的事情:
final int i = 0;
int max = 5;
Map<String, Object> map = new HashMap<>();
map.put("ads", "123");
map.put("qwe", "123");
map.put("cvb", "123");
map.put("asd", "123");
map.put("iop", "123");
map.put("jkl", "123");
map.put("yui", "123");
List list = map.entrySet().stream().filter(y -> i++ < max).collect(Collectors.toList());
预期输出:
具有 2 个值的映射
包含 5 个值的列表
【问题讨论】:
-
不清楚你想做什么,并且发布的代码一开始就没有编译。请提供您想要做的示例输入和预期输出,例如只有 10 个元素。
-
请注意,在执行
.collect或.forEach之类的终端操作后,您将无法再使用Stream。 -
@ÓscarLópez 感谢您的反馈,我对问题进行了一些更改并添加了输入和输出。
-
另外,做请注意
entrySet()不保证其元素的顺序。它们不一定是您添加的前五个,除非您使用的是LinkedHashMap。但总的来说,从地图中获取“前 n 个元素”的想法没有意义,如果顺序很重要,也许您应该使用不同的数据结构。 -
最后意味着
i一旦分配就不能更改。所以你不能这样做filter(y -> i++ < max).即使你没有声明ifinal,局部变量在lambdas中也必须是有效的。
标签: java collections java-stream