有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在给定的基于Java流的代码中处理空指针

我有下面给定的数据结构
在给定的代码块中,我试图从给定的HashMap中获取对象Dc
如果地图已获得与给定键(cNumber)关联的对象,则该代码段将起作用
我的问题是,当在映射中找不到给定的键时,如何处理(//5)行中的空指针
如果有人能够修改这个基于流的代码来处理异常,这将是一个很大的帮助

public class Dc {   
private String cNumber;     
private Optional<List<pTerms>> pTerms;   
}    

public class Dd {   
private String cParty;   
//Dc:cNumber is the Key   
private Optional<Map<String,Dc>> dealCommits;   
}    

public class PTerms {   
private String pType;  
}     


public String check(String tMonth,String cNumber,Dd dDetails)      
{     
Optional<DealPricingTerms> dealPricingTerms = dDetails    
    .getDealCommits().get()     
    .get(cNumber)     
   .getPTerms().get().stream()   //5      
    .filter(dealPricingTerm ->  
            tMonth.equals(dealPricingTerm.getDeliveryPeriod()))      
    .findFirst();        
    return dealPricingTerms.isPresent()? "Success" : "failed";  
}   

共 (2) 个答案

  1. # 1 楼答案

    在条件筛选器之前,必须添加筛选器以检查null

    。过滤器(对象::非空)

    比如

     List<String> carsFiltered = Optional.ofNullable(cars)
                .orElseGet(Collections::emptyList)
                .stream()
                .filter(Objects::nonNull) //filtering car object that are null
                .map(Car::getName) //now it's a stream of Strings
                .filter(Objects::nonNull) //filtering null in Strings
                .filter(name -> name.startsWith("M"))
                .collect(Collectors.toList()); //back to List of Strings
    
  2. # 2 楼答案

    你不应该在你的选项上调用get(),当你使用Optional.map时,你有一个很好的方法将一个空结果从映射中包装到另一个可选的:

    Optional<PTerms> dealPricingTerms = dDetails
            .getDealCommits().map(c -> c.get(cNumber))
            .flatMap(dc -> dc.getPTerms())
            .map(l -> l.stream())
            .flatMap(s ->
                    s.filter(dealPricingTerm ->
                            tMonth.equals(dealPricingTerm.getDeliveryPeriod()))
                            .findFirst());