Java 使用基于密钥列表的流过滤器映射

Java 使用基于密钥列表的流过滤器映射,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我有一个特别的问题,我想知道Java8StreamsAPI能否解决这个问题。我知道这可以在使用Streams API之外完成,但如果可以使用Streams来完成,我不想添加与尝试实现这一点相关的所有样板代码。我有一张地图 Map<String, String> greetings = new HashMap<>(); greetings.put("abc", "Hello"); greetings.put("def", "Goodbye"); greetings.put(

我有一个特别的问题,我想知道Java8StreamsAPI能否解决这个问题。我知道这可以在使用Streams API之外完成,但如果可以使用Streams来完成,我不想添加与尝试实现这一点相关的所有样板代码。我有一张地图

Map<String, String> greetings = new HashMap<>();
greetings.put("abc", "Hello");
greetings.put("def", "Goodbye");
greetings.put("ghi", "Ciao");
greetings.put("xyz", "Bonsoir");
Map问候语=newhashmap();
问候语。把(“abc”,“你好”);
问候。把(“def”,“再见”);
问候语。把(“ghi”、“Ciao”);
问候。把(“xyz”,“Bonsoir”);
和一个密钥列表:

List<String> keys = Arrays.asList("def", "zxy");
List key=Arrays.asList(“def”、“zxy”);
使用上述Streams API,是否可以将其过滤为:

Map<String, String> filteredGreetings = new HashMap<>();
filteredGreetings.put("def", "Goodbye");
filteredGreetings.put("xyz", "Bonsoir");
Map filteredGreetings=newhashmap();
filteredGreetings.put(“def”,“再见”);
过滤过滤过滤。放置(“xyz”,“Bonsoir”);
希望这是我努力实现的目标

到目前为止,我只在指定要过滤贴图键集的确切键时才使用它,但这样只会返回一个条目集。我对完全过滤下来的地图感兴趣,我正在努力实现这一点。

试试这个

filteredGreetings= keys.stream()
                  .collect(Collectors.toMap(Function.identity(),key->greetings.get(key)));
甚至对于缺少的键,您也可以使用
getOrDefault()
方法

... .collect(Collectors.toMap(Function.identity(),key->greetings.getOrDefault(key,"")));
试试这个:

Map<String, String> result = keys.stream()
        .filter(greetings::containsKey)
        .collect(Collectors.toMap(Function.identity(), greetings::get));

如果问题中的输入和预期输出不一致,还可以将输入映射的键保留为:

Map<String, String> futureGreetings = new HashMap<>(greetings);
futureGreetings.keySet().retainAll(keys);
Map futureGreetings=新的HashMap(问候语);
futureGreeties.keySet().retainal(键);

因为我添加了第二种方法。虽然我认为他并不是说两个元素的列表中没有键,但时间复杂性实际上并不重要。事实上,散列的开销将高于线性查找。@Holger是的,这是真的。只想为将军添加这些信息。@SamuelPhilipp现场-非常感谢!我也不知道“身份”。我需要多读一点。@RichardC
Function.identity()
I->I
的同义词。这只是巧合、输入错误还是要求,我注意到键
“zxy”
,结果仍然
put(“xyz”,“Bonsoir”)
?是的,这是输入错误。当然,很抱歉,这不使用流,但在选择之前,可以比较两种解决方案的复杂性和可读性。这是最好、最简单的解决方案。比我的好多了;)
Set<String> keys = new HashSet<>(Arrays.asList("def", "zxy"));
Map<String, String> futureGreetings = new HashMap<>(greetings);
futureGreetings.keySet().retainAll(keys);