假设我们有结构如下一类:
class Resource{
String id;
String name;
List<String> friends;
}
有没有办法让这样使用“可选”列表:
Optional.of(resource.getFriends()).map(friends -> {
friends.add("John");
return friends;
}).orElseGet(
//do something here.
)
如果是以前没有一个新的列表的预期。
这取决于你更精确的功能要求。我提出了几个方案。
如果你只是想要一个包含资源和约翰的朋友列表:
List<String> listWithJohn = Optional.ofNullable(resource.getFriends())
.orElseGet(ArrayList::new);
listWithJohn.add("John");
罗勒布尔克在评论中提到,因为Java的9名单初始化可以代替使用来完成Objects.requireNonNullElseGet
:
List<String> listWithJohn
= Objects.requireNonNullElseGet(resource.getFriends(), ArrayList::new);
相反,如果你想约翰添加到资源的朋友,我建议getFriends
的方法是在哪里编辑:
/** @return The list of friends, not null */
public List<String> getFriends() {
if (friends == null) {
friends = new ArrayList<>();
}
return friends;
}
返回列表本身使得资源易受呼叫者修改他们的朋友名单不期望的和不可预知在以后的任何时候,虽然。通常,一个希望返回列表中的副本或它的一个不可改变的视图,而不是(阻止主叫方加入约翰的朋友)。在这种情况下,资源可以有一个addFriend
添加好友的方法。
编辑:
有没有办法只有一个拉姆达行代码做什么呢?
friends = friends == null ? new ArrayList<>() : friends;
return friends;
但我发现它的可读性(而且也没有拉姆达那里,它只是一个班轮)。或者,如果你想让它完全隐蔽:
return friends = friends == null ? new ArrayList<>() : friends;
不建议。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句