繁体   English   中英

java 8 map.get多个键值

[英]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 是一个好的开始,但是,对于迭代和处理多个输入,您需要使用代替,然后在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM