如何使用 lambda 更新列表和子列表

问题描述 投票:0回答:1

如果可能的话,我想使用流和 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 lambda java-stream
1个回答
2
投票

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.