2016-10-21 48 views
-1

下面的代碼是在我的項目現有的代碼,使用相同的概念,我更新的項目,獲得NullPointerException異常,而使用Lambda表達式

public static List<Option> filterNetworkSettingsOptionBySetting(NetworkSettingsGroup group, 
     String settingName) { 
    LOGGER.info("************ Filtering Option based on SettingName ************"); 
    LOGGER.info("***** Setting Name "+settingName); 
    List<Option> newOptions = new ArrayList<Option>(); 
    if (group == null || group.getOptions() == null || group.getOptions().isEmpty() 
      || StringUtils.isBlank(settingName)) 
     return newOptions; 

    List<Option> oldOptions = group.getOptions(); 
    LOGGER.info("Before Filtering Options "+oldOptions); 
    Stream<Option> stream = oldOptions.stream(); 
    LOGGER.info("Before Filtering Stream "+stream); 

    newOptions.addAll(group.getOptions().stream() 
      .filter(option -> option.getName().equalsIgnoreCase(settingName)).collect(Collectors.toList())); 

    return newOptions; 
} 

我得到的NullPointerException在

newOptions.addAll(group.getOptions().stream() 
      .filter(option -> option.getName().equalsIgnoreCase(settingName)).collect(Collectors.toList())); 

這一步.. 我不能夠理解這一步,任何人都可以清楚地解釋我的步驟...在那一步發生了什麼,我該如何將該步驟分成多個步驟(因爲我想檢查方法調用null是未來)。

+1

好像你的getname給你null –

回答

3

你已要求解釋的說法是:

newOptions.addAll(group.getOptions().stream() 
     .filter(option -> option.getName() 
      .equalsIgnoreCase(settingName)) 
     .collect(Collectors.toList())); 

addAll需要收集所以語句中返回一個集合(列表,實際上)。

group.getOptions()必須返回一個集合。這不應該是null。

.stream()輪流收集到的物品

.filter(option -> option.getName().equalsIgnoreCase(settingName))流過濾的選項流只有他的名字等於settingName(不區分大小寫)選項。

.collect(Collectors.toList())將流轉換爲要添加到newOptions的列表。

在檢查空值方面,上述所有方法都無法返回null:它們全都返回StreamList。然而,選項的方法可能是getName。因此,實際上,它是getOptionsgetName,它返回一個空值。

我會建議更改爲以下幾點:

Collection<Option> options = group.getOptions(); 
assert(options != null); 
assert(settingName != null); 
newOptions.addAll(options.stream() 
    .filter(o -> settingName.equalsIgnoringCase(o.getName())) 
    .collect(Collectors.toList()); 

然後失敗的斷言將提醒您注意空值。通過切換equalsIgnoringCase,代碼將過濾掉空名稱而不是拋出異常。