我相信这是直截了当的,但出于某种原因,我没有得到我想要的。
我有一个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}除了包含“接受”的键外,我如何在地图中流动并过滤掉所有内容?
这就是我试过的:
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));
} 但由于“非静态方法不能从静态上下文引用”而失败。
发布于 2019-10-11 02:41:27
您需要使用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));发布于 2019-10-10 23:07:19
最终,该方法不编译,因为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()的重载版本的Supplier<Map>,以便为输出提供一个SortedMap。
https://stackoverflow.com/questions/58331795
复制相似问题