使用流比较地图时如何处理空值 - Java?

Bel*_*a92 3 java java-8 java-stream

我有 2 个数据结构,其值如下:

List<Map<String,String>> customerDirectory
Run Code Online (Sandbox Code Playgroud)
[{NAME=ALEX BENSON, PHONE=012-12342, ADDRESS=123 MAIN ST, CITY=QUEENS, STATE=NY},
 {NAME=ZOYE ABEL, PHONE=012-12445, ADDRESS=123 WATERSIDE, CITY=WINDSOR, STATE=CT}]
Run Code Online (Sandbox Code Playgroud)

Map<String,String> customerInfo
Run Code Online (Sandbox Code Playgroud)
{NAME=ALEX BENSON, PHONE=012-12342, ADDRESS=123 MAIN ST}
Run Code Online (Sandbox Code Playgroud)

我正在尝试遍历customerDirectory以查找customerInfo键值是否完全匹配 -"NAME","PHONE","ADDRESS"以便我可以找到记录是否重复。

所以我想出了:

List<String> compareKeys = Arrays.asList("NAME","PHONE","ADDRESS");

Function<Map<String,String>, String> getVal = mp -> compareKeys.stream().map(mp::get).map(String::trim).collect(Collectors.joining());

BiPredicate<Map<String,String>, Map<String,String>> checkDup = (mp1,mp2) -> getVal.apply(mp1).equals(getVal.apply(mp2));

boolean anyMatch = customerDirectory.stream().anyMatch(customer-> checkDup.test(customerInfo, customer));
Run Code Online (Sandbox Code Playgroud)

但是customerInfo地图可以是有价值ADDRESSnull,对此我曾尝试:

BiFunction<Map<String, String>, String, String> handleNull = (mp, key) -> mp.get(key) == null ? " " : mp.get(key);
Run Code Online (Sandbox Code Playgroud)

我在以下方面使用过它:

Function<Map<String,String>, String> getVal = mp -> compareKeys.stream().map(key->handleNull.apply(mp,key)).map(mp::get).map(String::trim).collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)

但我最终还是得到了NullPointerException这意味着我可能错过了确切的流程。有没有更好的方法来处理null这里的值?

小智 5

如果我正确理解了您的问题,那么您只想知道是否有任何完全匹配,并且您希望将答案保留在anyMatch 中。请尝试使用以下代码更新您的代码。

Function<Map<String, String>, String> getVal = mp -> 
    compareKeys.stream().map(mp::get).filter(Objects::nonNull).map(String::trim)
            .collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)