gpt4 book ai didi

Java Lambda 从列表中获取元素

转载 作者:行者123 更新时间:2023-11-29 06:31:10 26 4
gpt4 key购买 nike

我有以下代码,它使用良好的旧 java 工作:

List<Bar> repo = ArrayList<>();
public Bar foo(int id) {
for(Bar c: repo){
if(c.getId() == id)
return c;
}
Bar target = new Bar();
target.setFooo("");
target.setId(0);
return target;
}

但是,我试图让它变得更好,(即只是想学习 lambdas)

public Bar foo(int id) {
Bar target = repo.stream().filter(c -> c.getId() == id)
.findFirst().orElse(null);
if(target == null){
target = new Bar();
target.setFooo("");
target.setId(0);
}
return target;
}

但上面的代码返回了一个 ArrayOutOfBounds 异常,我不太确定如何(因为它是一个列表)或为什么。

最佳答案

如果您想使用函数式编程技术,最好重构您的代码,以便能够完全使用构造函数、生成器或工厂方法构造对象。 Setter 是坏 friend ,因为它们意味着可变性,而函数式编程喜欢不可变的东西。

因此添加新的 Bar 构造函数:

public Bar(String fooo, int id) {
this.fooo = fooo;
this.id = id;
}

在这之后您可能会意识到所有的 Bar 对象都可以在没有 setter 的情况下使用。如果是这样,您可以简单地删除 setter 并使 Bar 字段成为最终字段,这样 Bar 将变得不可变。即使您不能在其他地方摆脱 setter,有了新的构造函数,您的 foo 方法也可以以更简洁的方式重写:

public Bar foo(int id) {
return repo.stream()
.filter(c -> c.getId() == id)
.findFirst()
.orElseGet(() -> new Bar("", 0));
}

关于Java Lambda 从列表中获取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558049/

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