我有一个包含多个列表的对象
public class Contribution<T extends MovieRequest> {
private Set<T> elementsToAdd;
private Set<T> elementsToUpdate;
private Set<Integer> numbersToDelete;
}
此对象被发送到该方法。在那里我操作这些列表。
public void correctOtherTitle(
final Contribution<OtherTitle> contribution
) throws ResourceNotFoundException {
contribution.getElementsToAdd().forEach(otherTitle -> {
...
});
contribution.getNumbersToDelete().forEach(number -> {
...
});
contribution.getElementsToUpdate().forEach(otherTitleToUpdate -> {
...
});
}
问题是没有必要完成所有列表,其中一些列表可能为空。然后抛出NullPointerException
异常。
当然,可以创建条件if
,但它看起来并不美观。
if(contribution.getElementsToAdd() !- null) {
contribution.getElementsToAdd().forEach(otherTitle -> {
...
});
}
看起来很致命。你知道怎么做得更好吗?
答案 0 :(得分:0)
为避免使用显式if
进行非空检查,您可以将包含实际数据的Contribution
类字段的类型更改为Optional
:
public class Contribution<T extends MovieRequest> {
private Optional<Set<T>> elementsToAdd;
private Optional<Set<T>> elementsToUpdate;
private Optional<Set<Integer>> numbersToDelete;
}
并因此适应吸气剂。
通过这种方式,您可以使用省略显式非空检查的Optional.ifPresent(Consumer<? super T> consumer)
:
contribution.getElementsToAdd().ifPresent(otherTitle -> {
otherTitle.forEach(m -> ...);
});
也没有必要非常优雅。
但是,它会减少代码重复,而不会引入中间变量(这可能会产生副作用)。
确实调用了Getter方法一次。
答案 1 :(得分:0)
问题是没有必要完成所有列表,其中一些列表可能为空。
我认为你应该解决根本问题,而不是解决它。为什么这些集合可以为空?你已经有了一个安全的&#34;表示没有添加/删除/更新的方法 - 空集。因此,如果这些集合在您的控制之下(事实上它们是private
并且您有吸气剂意味着这一点),那么您应该强制执行该不变量。
例如,您的Contribution
课程可能如下所示:
public class Contribution<T extends MovieRequest> {
private Set<T> elementsToAdd = new HashSet<>();
// ... same for elementsToUpdate / numbersToDelete ...
public Set<T> getElementsToAdd() {
return Collections.ummodifiableSet(elementsToAdd);
}
public void addElementToAdd(T element) {
elementsToAdd.add(element);
}
}
这种模式涉及相当多的样板。但是像Immutables这样的代码生成器对此有很大的帮助。