gpt4 book ai didi

java - 如何从 "unmodifiable"映射中删除 null 或空列表

转载 作者:行者123 更新时间:2023-11-29 06:48:40 25 4
gpt4 key购买 nike

我有一个不可修改的 map ( Map<String, Object> )。这包含一个键值对,其中值应该是一个列表,但对于特定键,值是一个空列表。

如何从 map 中删除该空列表并返回?

我已经使用谓词完成了它,它检查值是否是集合的实例,然后检查 Collections.isNotEmpty(..)。

我想知道还有比这更好的方法吗? (在 Java 8 中)

public class StudentTest {

Predicate<Object> isCollectionNotEmpty = input -> {
if (input instanceof Collection) {
return CommonCollectionUtils.isNotEmpty((Collection<?>)input);
}
return true;
};
Predicate<Object> isObjectNotNull = input -> Objects.nonNull(input);

public static void main(String[] args) {

StudentTest s = new StudentTest();
final Map<String, Object> map1 = new HashMap<>();
map1.put("student_batch_size", 200);
map1.put("student_avg_height", 172);
map1.put("Student_names", Collections.emptyList());

final Map<String, Object> finalMap = s.getFinalMap(Collections.unmodifiableMap(map1));

System.out.println(finalMap);
}

private Map<String, Object> getFinalMap(final Map<String, Object> inputMap) {
final Map<String, Object> resultMap = new HashMap<>();
//inputMap.values().remove(Collections.emptyList());
resultMap.putAll(inputMap.entrySet().stream()
.filter(entry -> isObjectNotNull.and(isCollectionNotEmpty).test(entry.getValue()))
.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())));
return resultMap;
}

}

预期输出:

{student_avg_height=172, student_batch_size=200}

最佳答案

Collection#removeIf可能是一个值得考虑的好选择。

private Map<String, Object> getFinalMap(final Map<String, Object> inputMap) {
final Map<String, Object> resultMap = new HashMap<>(inputMap);
resultMap.entrySet().removeIf(e -> e.getValue() instanceof Collection && ((Collection) e.getValue()).isEmpty());

return resultMap;
}

如果基于流的方法对您更有吸引力

private Map<String, Object> getFinalMap(final Map<String, Object> inputMap) {
return inputMap.entrySet()
.stream()
.filter(e -> !(e.getValue() instanceof Collection && ((Collection) e.getValue()).isEmpty()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

更新

如果你想过滤掉 null 对象而不考虑它们的类型,这里对上面提到的方法稍作改动

1) 移除如果

resultMap.entrySet()
.removeIf(e -> Objects.isNull(e.getValue()) ||
(e.getValue() instanceof Collection && ((Collection) e.getValue()).isEmpty());

2) 基于流

.filter(e -> Objects.nonNull(e.getValue()))
.filter(e -> !(e.getValue() instanceof Collection && ((Collection) e.getValue()).isEmpty()))

关于java - 如何从 "unmodifiable"映射中删除 null 或空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57345741/

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