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地图可以是有价值ADDRESS的null,对此我曾尝试:
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)