我确信这很简单,但是由于某种原因我没有得到想要的东西。

我有一个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.animal=dog, accepted.bird=owl, accepted.food=broccoli}


如何浏览地图并过滤掉包含“ accepted”键的所有内容?

这是我尝试的:

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));
}


但是由于“无法从静态上下文引用非静态方法”而失败。

最佳答案

您需要使用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));

09-28 01:25