使用Lambda表达式时获取NullPointerException

时间:2016-10-21 06:21:15

标签: java lambda java-8

以下代码是我项目中的现有代码,使用相同的概念,我正在更新项目,

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即将到来)。 / p>

1 个答案:

答案 0 :(得分:4)

您要求解释的陈述是:

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

addAll接受一个集合,因此内部语句返回一个集合(实际上是一个列表)。

group.getOptions()必须返回一个集合。这不应该是空的。

.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());

然后失败的断言将提醒您null值。通过切换equalsIgnoringCase,代码将过滤掉空名而不是抛出异常。