嵌套条件的JAVA中的Lambda表达式

Joh*_*yun 5 java lambda java-8

我有以下内容Map:

HashMap<String, String> map1= new HashMap<String, String>();
map1.put("1", "One");
map1.put("2", "Two");
map1.put("3", "Three");
Run Code Online (Sandbox Code Playgroud)

我有一个numbers包含的列表["1","2","3"]

我必须执行以下操作:

List<String> spelling= new ArrayList<>();
for (String num: numbers) {
    if (map1.containsKey(num)){
        spelling.add(map1.get(num))
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用lambda表达式编写上述代码?

Era*_*ran 14

使用Stream:

List<String> spelling = numbers.stream()
                               .map(map1::get)
                               .filter(Objects::nonNull)
                               .collect(Collectors.toList());
System.out.println (spelling);
Run Code Online (Sandbox Code Playgroud)

请注意containsKey,我只是使用get,而不是检查键是否在地图中,然后过滤掉了nulls.

输出:

[One, Two, Three]
Run Code Online (Sandbox Code Playgroud)

  • @MehrajMalik如果键不在地图中,`map1.get(k)`将返回`null`. (6认同)
  • 请注意,如果`map1`可能包含`null`值,则此解决方案可能会产生意外结果(取决于您是否要在输出中保留那些'null`值) (3认同)
  • @Ward是的,如果`map1`包含`null`值并且你希望将它们保存在输出中,你将不得不使用`.filter(k-> map1.containsKey(k))`. (2认同)

War*_*ard 5

Eran解决方案的变体:

  1. 使用方法引用
  2. 使用containsKey而不是检查nullvalues => if map1是否包含null值,检查null值会产生错误的结果.

代码片段:

List<String> spelling = numbers.stream()
        .filter(map1::containsKey)
        .map(map1::get)
        .collect(Collectors.toList());
System.out.println (spelling);
Run Code Online (Sandbox Code Playgroud)

  • 取决于期望的结果:如果你想保留`null`值,使用`containsKey`只是唯一的方法,而Erans的答案会产生错误的结果.即使你不想保留`null`值,一个_could_认为带有`containsKey`的版本更清楚地表达了代码的意图. (2认同)