为了账号安全,请及时绑定邮箱和手机立即绑定

流式传输和过滤 SortedMap

流式传输和过滤 SortedMap

白衣非少年 2023-10-13 17:25:41
我确信这很简单,但由于某种原因我没有得到我想要的。我有一个SortedMap<String, String>值,我想对其进行流式传输和过滤并仅保存一些值。例如:    SortedMap<String, String> input = new TreeMap<>();    values.put("accepted.animal", "dog");    values.put("accepted.bird", "owl");    values.put("accepted.food", "broccoli");    values.put("rejected.animal", "cat");    values.put("rejected.bird", "eagle");    values.put("rejected.food", "meat");我只想保留密钥中包含“accepted”的值并删除其他所有内容。所以,结果将是:{accepted.animal=dog, accepted.bird=owl, accepted.food=broccoli}如何流式传输地图并过滤掉除包含“已接受”的键之外的所有内容?这是我尝试过的:private SortedMap<String, String> process(final Input input) {    final SortedMap<String, String> results = new TreeMap<>();    return input.getInputParams()                .entrySet()                .stream()                .filter(params -> params.getKey().contains("accepted"))                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));} 但由于“无法从静态上下文引用非静态方法”而失败。
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

您需要使用另一种变体Collectors.toMap,以便传递合并函数和供应商以在TreeMap那里收集:

return input.getInputParams()
        .entrySet()
        .stream()
        .filter(params -> params.getKey().startsWith("accepted")) // small change
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                (a, b) -> b, TreeMap::new));


查看完整回答
反对 回复 2023-10-13
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

最终,该方法不会编译,因为Collectors.toMap()返回Map,而方法签名需要返回类型为SortedMap。


我不知道误导性的“静态上下文”错误消息背后的原因;但是当我尝试使用 Gradle 构建代码时,我收到了一条稍微有用的消息。


error: incompatible types: inference variable R has incompatible bounds

                  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

                          ^

      equality constraints: Map<K,U>

      lower bounds: SortedMap<String,String>,Object


Collectors.toMap()您可能需要接受 a的重载版本Supplier<Map>,以便您可以提供SortedMapfor 输出。


查看完整回答
反对 回复 2023-10-13
  • 2 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信