[英]java 8 map.get multiple key values
我有以下代码,我想在其中获取以相同名称开头的多个键的值:例如 contents_of_a1、contents_of_ab2、contents_of_abc3
Optional.ofNullable(((Map<?, ?>) fieldValue))
.filter(Objects::nonNull)
.map(coverages -> coverages.get("contents_of_%"))
.filter(Objects::nonNull)
.filter(LinkedHashMap.class::isInstance)
.map(LinkedHashMap.class::cast)
.map(contents -> contents.get("limit"))
.map(limit -> new BigDecimal(String.valueOf(limit)))
.orElse(new BigDecimal(number));
我怎样才能通过 contents_of%
我不知道数据结构背后的原因以及您想要实现的目标。
但是,这并不重要,因为这很容易复制。
使用 Optional 是一个好的开始,但是,对于迭代和处理多个输入,您需要使用java-stream代替,然后在 collection 中使用 Optional (我假设您想要Map<String, BigDecimal
输出,但可以轻松调整) .
另外,注意.filter(Objects::nonNull)
是没有意义的,因为 Optional 在内部处理null
并且永远不会传递给下一个方法。
final Map<String, Map<?, ?>> fieldValue = Map.of(
"contents_of_a", new LinkedHashMap<>(Map.of("limit", "10")),
"contents_of_b", new HashMap<>(Map.of("limit", "11")), // Different
"contents_of_c", new LinkedHashMap<>(Map.of("amount", "12")), // No amount
"contents_of_d", new LinkedHashMap<>(Map.of("limit", "13")));
final List<String> contents = List.of(
"contents_of_a",
"contents_of_b",
"contents_of_c",
// d is missing, e is requested instead
"contents_of_e");
final int number = -1;
final Map<String, BigDecimal> resultMap = contents.stream()
.collect(Collectors.toMap(
Function.identity(), // key
content -> Optional.of(fieldValue) // value
.map(coverages -> fieldValue.get(content))
.filter(LinkedHashMap.class::isInstance)
// casting here to LinkedHashMap is not required
// unless its specific methods are to be used
// but we only get a value using Map#get
.map(map -> map.get("limit"))
.map(String::valueOf)
.map(BigDecimal::new)
// prefer this over orElse as Optional#orElseGet
// does not create an object if not required
.orElseGet(() -> new BigDecimal(number))));
// check out the output below the code
resultMap.forEach((k, v) -> System.out.println(k + " -> " + v));
仅使用a
的内容,因为其余内容要么不是LinkedHashMap
的实例,不包含密钥limit
,要么不在请求的内容中。
contents_of_a -> 10 contents_of_b -> -1 contents_of_e -> -1 contents_of_c -> -1
如果要过滤以“contents_of_”开头的键的映射,可以在 Java 8 中执行此操作:
Map<String, Object> filteredFieldValue = fieldValue.entrySet().stream().filter(e -> {
String k = e.getKey();
return Stream.of("contents_of_").anyMatch(k::startsWith);
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.