gpt4 book ai didi

java - 基于条件设置对象值并使用 java 8 流返回 boolean 值

转载 作者:行者123 更新时间:2023-12-02 15:14:25 24 4
gpt4 key购买 nike

我有嵌套列表,并且能够在条件为真时设置 isMatched 和 department.setMatchedStatus(true)。

boolean isMatched = false;
for (Employee employee: company.getEmployees()) {
for (Department department: employee.getDepartments()) {
if(departmentList.contains(department.getDepartmentName())){
isMatched = true;
department.setMatchedStatus(true);
}
}
}
return isMatched;

想使用 java 8 流实现相同的效果,我尝试使用下面的代码,但无法返回 boolean 值。

 isMatched = company.getEmployees().stream()
.flatMap(employee-> employee.getDepartments().stream())
.filter((department) -> departmentList.contains(department.getDepartmentName()))
.forEach((department) -> department.setMatchedStatus(true));

谁能帮我解决这个问题?

最佳答案

这里的难点在于您有两个想要执行的副作用:在 Department 对象上设置匹配状态,并设置本地标志值以确定是否有任何匹配。 sisyphus' answer中使用peekcount的方法会起作用,因为在这种情况下我们可以确信 count 不会短路。但是,它可能会导致维护中出现问题。如果有人复制并重新排列这段代码,它可能会因为短路而悄无声息地崩溃,这将是非常微妙的。

也许更好的方法是将副作用打包到 forEach 操作中。这使用 AtomicBoolean 作为可变“框”来解决无法改变捕获的局部变量的问题。它也比单元素数组技巧更可取,因为在流并行运行的情况下原子是安全的。

这也使用了 lambda 语句,我通常更愿意避免这种情况。在这种情况下,还算不错,而且很明显会出现多种副作用。

    AtomicBoolean isMatched = new AtomicBoolean(false);
company.getEmployees().stream()
.flatMap(employee -> employee.getDepartments().stream())
.filter(department -> departmentList.contains(department.getDepartmentName()))
.forEach(department -> {
department.setMatchedStatus(true);
isMatched.set(true);
});
return isMatched.get();

关于java - 基于条件设置对象值并使用 java 8 流返回 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346399/

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