gpt4 book ai didi

避免多次循环的Java流优雅解决方案

转载 作者:行者123 更新时间:2023-12-04 08:44:09 25 4
gpt4 key购买 nike

class Note{
private text;
..
private int score = 0;
}

class Project{
...
List<Note> notes;
private int score = 0;
}
项目分数由项目属性 + 音符分数总和得出。
首先,我正在更新和替换项目中的所有注释。然后再次迭代以求和音符得分。
 project.notes(project.notes()
.stream()
.map(this::updateNote)
.collect(Collectors.toList()));

project.score(project.notes()
.stream()
.mapToInt(n->n.score())
.sum());

private Note updateNote(Note note){
note.score(....);
return note;
}
不知怎的,我觉得这是不对的。是否有避免循环两次的优雅解决方案?

最佳答案

在像这样的 map 操作中执行一个有副作用的方法是可疑的,无论你想如何切分这个谜题,它总是看起来有点奇怪。
您在这里滥用 map:您将对象映射到自身,但这样做会导致副作用。好吧,一分钱,一英镑,我想 - 这是这里可疑的事情,但代码有效(它只是糟糕的风格)。另请注意,将收集到的列表传递给 project.notes 什么都不做 , 只是 project.notes().stream().map(this::updateNote).collect(Collectors.toList())并让 Collection 丢失给已经“作品”的任何一个。收集的唯一目的只是强制流实际迭代(映射不会导致迭代,它只是说:当您开始迭代时,随手映射)。
所以:

project.notes()
.stream()
.map(this::updateNote)) // no-op streamwise. Just making the side effect happen
.mapToInt(this::score)
.sum();
就是你所需要的——但它……还是有点臭。如果不是 updateNote , 注意是不可变的,还有一个 calculateScore方法,你可以这样做:
project.notes()
.stream()
.mapToInt(this::calculateScore)
.sum()
在这里, calculateScore不会改变 Note 的任何内容对象,它只是......计算分数并返回它,而不改变任何字段。
编辑:我忘记了流中的“流”,并添加了说明。

关于避免多次循环的Java流优雅解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64415569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com