如果可能的话,我想使用流和 lambda 更新父列表和子列表。
父级是
Event
,其中包含Band
的列表; Band
的列表包含 Member
的列表。
我必须通过添加乐队列表的大小来更新每个活动的标题(示例:“U2 Concert Event [5]”)。我还必须更新每个乐队,以便在名称中添加成员列表的大小乐队的成员(示例:“U2 [3]”)
如何使用流和 lambda 来实现此目的?
这是我的实际代码:
list.stream().peek(e -> e.setTitle(e.getTitle()+" "+e.getBands().size()))
.forEach(updatedEvent -> updatedEvent.getBands().stream()
.forEach(b -> b.setName(b.getName()+"["+b.getMembers().size()+"]")));
Java 强烈鼓励您仅将
peek
方法用于调试目的文档参考。
API说明:
此方法的存在主要是为了支持调试,您希望在元素流过管道中的某个点时查看元素:
此外,Java 建议避免流操作中的有状态行为和副作用文档参考。
一般来说,不鼓励流操作的行为参数产生副作用,因为它们通常会导致无意中违反无状态性要求,以及其他线程安全隐患。
您可以在此 Stack Overflow 线程中找到更详细的答案 在 Java 流中,peek 真的仅用于调试吗?.
我建议您使用
forEach
方法几次,甚至使用常规 for
循环。
list.forEach(e -> e.setTitle(e.getTitle() + " " + e.getBands().size()));
list.forEach(e -> e.getBands().forEach(b -> b.setName(b.getName() + "[" + b.getMembers().size() + "]")));
您可以将复杂的 lambda(或其部分)提取到私有方法中,以使代码更具可读性。例如
list.forEach(this::changeEventTitle);
list.forEach(e -> e.getBands().forEach(this::changeBandName));
private void changeEventTitle(Event event) {
int size = event.getBands().size();
String newTitle = event.getTitle() + " " + size;
event.setTitle(newTitle);
}
private void changeBandName(Band band) {
int size = band.getMembers().size();
String newName = band.getName() + "[" + size + "]";
band.setName(newName);
}