以下代码是我项目中的现有代码,使用相同的概念,我正在更新项目,
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;
}
我在
收到NullPointerExceptionnewOptions.addAll(group.getOptions().stream()
.filter(option -> option.getName().equalsIgnoreCase(settingName)).collect(Collectors.toList()));
这一步.. 我无法理解这一步,任何人都可以清楚地向我解释这一步......在该步骤中发生了什么以及如何将该步骤分成多个步骤(因为我想检查方法调用null即将到来)。 / p>
答案 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:它们都返回Stream
或List
。但是,getName
方法的选项可能是。所以,实际上,getOptions
或getName
返回空值。
我建议改为:
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
,代码将过滤掉空名而不是抛出异常。