使用 Java 8 可选进行安全的地图遍历

2022-09-04 02:49:15

我在我的Java 8类中。我需要导航到像 这样的叶字符串,如果相关 Map 中存在或不存在,则返回。Map<String, Map<String, String>> myMapmyMap['keyA']['keyB']null'keyA''keyB'

在时髦中,我会使用它并完成它。我知道Java 8将类似的行为带入了java。有没有办法使用这种新行为来简洁地模仿时髦的功能?如果没有,有没有另一种简洁的方法可以在Java 8中获得这种行为,或者我仍然被困在复杂的过程代码中?myMap?.keyA?.keyBOptional<T>


答案 1
String valueOrNull = Optional.ofNullable(myMap.get("keyA"))
                             .map(x -> x.get("keyB"))
                             .orElse(null);

首先,它将第一次查找的结果包装在一个可选中,该选项充当 monad。如果添加第三层 (),它将如下所示:myMap.?keyA.?keyB.?keyC

String valueOrNull = Optional.ofNullable(myMap.get("keyA"))
                             .map(x -> x.get("keyB"))
                             .map(x -> x.get("keyC"))
                             .orElse(null);

答案 2

您可以使用 OptionalofNullable 方法来创建一个可能表示值,也可能不表示值的方法。然后,您可以使用 map 方法,如果该值尚未存在,则该方法将具有 ,将结果映射到新值。OptionalnullFunctionnull

在这里,我提供一个作为 lambda 表达式,以使用第二个键从第二个键获取值。FunctionMap

Optional<String> result = Optional.ofNullable(myMap.get("keyA")).map(m -> m.get("keyB"));

从那里,您可以看到 是否具有 的值,如果是,则使用 获取它。OptionalisPresent()get()

测试:

public static Optional<String> method(Map<String, Map<String, String>> map,
    String key1, String key2)
{
    return Optional.ofNullable(map.get(key1)).map(m -> m.get(key2));
}

主叫区号:

Map<String, Map<String, String>> myMap = new HashMap<>();
Map<String, String> inner = new HashMap<>();
inner.put("one", "two");
myMap.put("three", inner);
System.out.println(method(myMap, "three", "one"));
System.out.println(method(myMap, "three", "dne"));
System.out.println(method(myMap, "dne", "dne"));

输出:

Optional[two]
Optional.empty
Optional.empty

推荐