流式传输和过滤 SortedMap
Stream and filter a SortedMap
我相信这很简单,但出于某种原因我没有得到我想要的。
我有一个 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}
如何通过地图流式传输并过滤除包含 "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));
}
但由于 "Non-static method cannot be referenced from static context" 而失败。
最终,该方法无法编译,因为 Collectors.toMap()
returns Map
,而方法签名需要 return 类型的 SortedMap
。
我不知道误导性 "static context" 错误消息背后的原因;但是当我尝试使用 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
您可能需要接受 Supplier<Map>
的 Collectors.toMap()
的重载版本,以便您可以为输出提供 SortedMap
。
您需要使用 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));
我相信这很简单,但出于某种原因我没有得到我想要的。
我有一个 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}
如何通过地图流式传输并过滤除包含 "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));
}
但由于 "Non-static method cannot be referenced from static context" 而失败。
最终,该方法无法编译,因为 Collectors.toMap()
returns Map
,而方法签名需要 return 类型的 SortedMap
。
我不知道误导性 "static context" 错误消息背后的原因;但是当我尝试使用 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
您可能需要接受 Supplier<Map>
的 Collectors.toMap()
的重载版本,以便您可以为输出提供 SortedMap
。
您需要使用 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));