Java 8 个流和 lambda
Java 8 streams and lambdas
我有一段非常有趣的代码,我想重构它以使用 java 8 流 API 功能
Map<String, Object> user = ...// pull user from somewhere
List<Map<String, Object>> attributes = ...// pull attributes from somewhere
List<Map<String, Object>> processedAttributes = new ArrayList<>();
for (Map<String, Object> attribute : attributes) {
if (!((List<Map<String, Object>>) attribute.get("subAttributes")).isEmpty()) {
for (Map<String, Object> subAttribute : (List<Map<String, Object>>) attribute.get("subAttributes")) {
if (!user.containsKey(subAttribute.get("name"))
&& Boolean.TRUE.equals(subAttribute.get("required"))) {
processedAttributes.add(subAttribute);
}
}
}
}
如何使用 java 8 个流进行重构?
这可以使用 flatMap
:
以非常简单的方式重写
List<Map<String, Object>> processedAttributes = attributes.stream()
.flatMap(
attribute -> ((List<Map<String, Object>>) attribute
.get("subAttributes")).stream())
.filter(subAttr -> !user.containsKey(subAttr.get("name"))
&& Boolean.TRUE.equals(subAttr.get("required")))
.collect(Collectors.toList());
请注意,您的代码中不需要 isEmpty
检查:如果 List
为空,则无论如何都不会执行 for
循环。
我有一段非常有趣的代码,我想重构它以使用 java 8 流 API 功能
Map<String, Object> user = ...// pull user from somewhere
List<Map<String, Object>> attributes = ...// pull attributes from somewhere
List<Map<String, Object>> processedAttributes = new ArrayList<>();
for (Map<String, Object> attribute : attributes) {
if (!((List<Map<String, Object>>) attribute.get("subAttributes")).isEmpty()) {
for (Map<String, Object> subAttribute : (List<Map<String, Object>>) attribute.get("subAttributes")) {
if (!user.containsKey(subAttribute.get("name"))
&& Boolean.TRUE.equals(subAttribute.get("required"))) {
processedAttributes.add(subAttribute);
}
}
}
}
如何使用 java 8 个流进行重构?
这可以使用 flatMap
:
List<Map<String, Object>> processedAttributes = attributes.stream()
.flatMap(
attribute -> ((List<Map<String, Object>>) attribute
.get("subAttributes")).stream())
.filter(subAttr -> !user.containsKey(subAttr.get("name"))
&& Boolean.TRUE.equals(subAttr.get("required")))
.collect(Collectors.toList());
请注意,您的代码中不需要 isEmpty
检查:如果 List
为空,则无论如何都不会执行 for
循环。