Java Stream Map 过滤、删除和收集

Jos*_*que 0 java collections java-stream

我有Map1000 个项目,我想List从它的前 500 个项目中生成一个,Map并删除从Map.

换句话说,我想过滤、收集到 aList并从 a 中删除项目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());
Run Code Online (Sandbox Code Playgroud)

预期输出:

具有 2 个值的映射

包含 5 个值的列表

Ans*_*den 7

Stream API 旨在创建一个新集合,而不是更改现有集合,从中创建一个流。

在这种情况下最好使用迭代器功能。像这样:

final int MAX = 500;

Map<String, String> map = new HashMap<>();
map.put("Item1", "Item 1 value");
map.put("Item2", "Item 2 value");
// ...
map.put("Item1000", "Item 1000 value");

List<String> list = new ArrayList<>();


var iterator = map.entrySet().iterator();
for (int i = 0; i< MAX; i++) {
  if (iterator.hasNext()) {
    var item = iterator.next();
    list.add(item.getValue());
    iterator.remove();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 与“LinkedHashMap”配合使用可以很好地获取第一个“MAX”项目。请参阅有关 Óscar López 问题的评论。 (3认同)
  • 是的,您对“Iterator”和“LinkedHashMap”的看法是正确的,并且“LinkedHashMap”保证从地图中删除前 500 个插入的项目。 (2认同)