gpt4 book ai didi

java - java lambda 中的嵌套列表 Hashmap 处理

转载 作者:行者123 更新时间:2023-11-30 08:02:34 25 4
gpt4 key购买 nike

我有一些情况,我的页面列表包含 map 名称页面的集合,而在页面 map 中我有另一个调用组的列表,它看起来像:

List<Map<String,Object>> group = new ArrayList<>();
Map<String,Object> groupMap = new HashMap<>();
groupMap.put("G1F1", null); //<-- null value need to remove from groupMap
groupMap.put("G1F2", "F2value");
groupMap.put("G1F3", "F3value");
groupMap.put("G1F4", null);//<-- null value need to remove from groupMap
group.add(groupMap);

Map<String,Object> groupMap2 = new HashMap<>();
groupMap2.put("G2F1", null);//<-- null value need to remove from groupMap2
groupMap2.put("G2F2", "F2value");
groupMap2.put("G2F3", "F3value");
groupMap2.put("G2F4", null);//<-- null value need to remove from groupMap2
group.add(groupMap2);

Map<String,Object> page1 = new HashMap<>();
page1.put("PageID", "PID1001");
page1.put("Groups", group);

Map<String,Object> page2 = new HashMap<>();//<-- page2 do not have Groups need to remove from pages
page2.put("PageID", "PID1208");
Map<String,Object> page3 = new HashMap<>();//<-- page3 do not have Groups need to remove from pages
page3.put("PageID", "PID1212");
Map<String,Object> page4 = new HashMap<>();//<-- page4 do not have Groups need to remove from pages
page4.put("PageID", "PID1214");
Map<String,Object> page5 = new HashMap<>();
page5.put("PageID", "PID15555");
page5.put("Groups", group);

pages.add(page1);
pages.add(page2);
pages.add(page3);
pages.add(page4);
pages.add(page5);

在上面的页面对象中,我需要删除那些没有任何组的页面,在组中我需要删除那些具有空值的项目。

我尝试使用 java8 lamda 编写以下代码,但输出是意外的,类似于 [true, true, false, false]

Object object = pages.stream().filter(page -> page.containsKey("Groups"))
.map(page -> (List) page.get("Groups"))
.flatMap(x -> x.stream()).map(group -> ((Map<String,Object>)group).entrySet().removeIf(g -> g.getValue() == null)).collect(Collectors.toList());

我可以通过以下代码删除组中包含空值的所有项目:

pages.stream().filter(page -> page.containsKey("Groups"))
.map(page -> (List) page.get("Groups")).flatMap(x -> x.stream()).forEach(group -> ((Map<String,Object>)group).entrySet().removeIf(entry -> null == entry.getValue()));

但无法过滤掉页面意味着如果页面不包含任何组,那么我需要删除该页面用户单语句 lambda,我可以使用传统的 Java 迭代过程来完成它,它看起来像:

private static void sanitizePages() {
Iterator<Map<String,Object>> listIt = pages.iterator();
while(listIt.hasNext()) {
Map<String,Object> item = listIt.next();

if(!item.containsKey(("Groups"))){
listIt.remove();
continue;
}
List<Map<String,Object>> groups = (List<Map<String,Object>>)item.get("Groups");
Iterator<Map<String,Object>> groupsIt = groups.iterator();

while(groupsIt.hasNext()) {
Map<String,Object> map = groupsIt.next();
Iterator<Entry<String, Object>> groupIt = map.entrySet().iterator();
while(groupIt.hasNext()) {
Entry<String,Object> group = groupIt.next();
if(null == group.getValue()) groupIt.remove();
}
}
}
}

但我需要 lambda 解决方案。

最佳答案

首先,当您想修改 集合时,Streams 不是合适的工具,但请注意集合本身有几个有用的方法。

如果你想赢得最大化使用 lambda 的奖励,你可以使用:

pages.removeIf(item -> {
List<Map<String,Object>> groups = (List<Map<String,Object>>)item.get("Groups");
if(groups==null) return true;
groups.forEach(map -> map.values().removeIf(Objects::isNull));
return false;
});

但请注意,像 removeAll 这样的旧方法仍然有效,并且并不比基于 lambda 的使用更复杂:

Set<Object> nulls=Collections.singleton(null);
pages.removeIf(item -> {
List<Map<String,Object>> groups = (List<Map<String,Object>>)item.get("Groups");
if(groups==null) return true;
groups.forEach(map -> map.values().removeAll(nulls));
return false;
});

当然,如果集合不是 Object 类型,代码会更简单,需要未经检查的类型转换……

关于java - java lambda 中的嵌套列表 Hashmap 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36842329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com