Обработка нулевого указателя в данном коде на основе потока Java - PullRequest
0 голосов
/ 09 июня 2019

У меня указанная ниже структура данных.
В данном блоке кода я пытаюсь получить Object Dc из заданного HashMap dealCommits.
Кусок кода будет работать, если с картой связан объектс данным ключом (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 голос
/ 09 июня 2019

Вы не должны вызывать 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());
0 голосов
/ 09 июня 2019

Вы должны добавить фильтр, чтобы проверить ноль перед фильтром условий.

.filter (Objects :: nonNull)

например,

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...