使用Java8流的if-else条件

使用Java8流的if-else条件,java,java-8,java-stream,Java,Java 8,Java Stream,场景:在这种情况下,我需要使用Java 8 streams API根据某些字段条件设置一些值,以列出对象 下面是objectUser的示例 public class User{ private int id; private String name; private String text; private boolean isActive; } 这是我制定的代码 List<User> users = userDao.getAllByCompanyI

场景:在这种情况下,我需要使用Java 8 streams API根据某些字段条件设置一些值,以
列出对象

下面是object
User
的示例

public class User{
    private int id;
    private String name;
    private String text;
    private boolean isActive;
}
这是我制定的代码

List<User> users = userDao.getAllByCompanyId(companyId);
users.stream()
     .filter(Objects::nonNull)
     .filter(User::isActive)
     .peek(user -> user.setText('ABC'))
     .filter(user -> !user.isActive())
     .peek(user -> user.setText('XYZ')
List users=userDao.getAllByCompanyId(companyId);
users.stream()
.filter(对象::非空)
.filter(用户::isActive)
.peek(用户->用户.setText('ABC'))
.filter(用户->!用户.isActive())
.peek(用户->用户.setText('XYZ'))
我知道我编写的基于条件将值设置为object的方法是错误的

这只是使用stream的一个尝试,最后我需要将值设置为
users
object


是否有办法处理if-else条件。

我在猜测期望的行为,如果我错了,请纠正我

可以在lambda表达式中使用块:

List<User> users = userDao.getAllByCompanyId(companyId);
users.stream().filter(Objects::nonNull).forEach(user -> {
    if (user.isPresent()) {
        user.setRole("ABC");
    } else {
        user.setRole("XYZ");
    }
});
List users=userDao.getAllByCompanyId(companyId);
users.stream().filter(Objects::nonNull).forEach(user->{
if(user.isPresent()){
user.setRole(“ABC”);
}否则{
user.setRole(“XYZ”);
}
});

也许你把这件事复杂化了

    List<User> users = new ArrayList<>();
    users.stream()
            .filter(Objects::nonNull)
            .forEach(u -> u.setRole(u.isActive()?"ABC":"XYZ"));
List users=new ArrayList();
users.stream()
.filter(对象::非空)
.forEach(u->u.setRole(u.isActive()?“ABC”:“XYZ”);

使用另一个带否定条件的
过滤器
操作无法完成您想要的操作,因为这将使您最终得到一个空流(即,如果从数字列表中删除<5个元素,然后删除>=5个元素,您将得到一个空列表)

实现您想要的最直接和干净的方法是使用
forEach
,就像在其他答案中一样,特别是对于这样一个简单的情况(包括调用相同的setter方法,根据条件,其参数为
ABC
XYZ

但是,如果您需要根据某些条件对每个元素应用不同的逻辑,则可能需要根据此条件对流进行分区,然后在每个分区上采取不同的操作:

Map<Boolean, List<User>> partitioned = users.stream()
    .filter(Objects::nonNull)
    .collect(Collectors.partitioningBy(User::isActive));
// Apply logic to active users partition
partitioned.get(true).forEach(u -> u.setText("ABC"));

// Apply logic to inactive users partition
partitioned.get(false).forEach(u -> u.setText("XYZ"));

请提供一个例子,你到底想要什么?为什么不想使用
.forEach
?因为这是一个终端操作?也许可以提供循环样式的代码,我们可以尝试将其更改为流?首先,你不应该在流式传输时修改数据源。这意味着你不应该
向我们设置角色在流式传输时,这些用户会被删除。此外,这会玷污
peek
调用的范围,该调用用于调试或分析目的。最后,还不太清楚您想对这些用户做什么,同时考虑到您可能正在从持久化源检索对象(由“DAO”引用暗示),但试图在内存中修改它们…如果用户不存在,请将用户角色设置为XYZ。我不理解这里的逻辑。没有用户,因此无法设置角色。
u->u.setRole(u.isPresent()?“ABC”:“XYZ”);
partitioned.forEach((b,l)->l.forEach(u->u.setText(b?“ABC”:“XYZ”))
好吧,我昨天考虑了所有这些选项以合并
分区,然后决定不发布任何变体,因为与直接的
用户相比没有任何好处。forEach(u->u.setText(u.isActive()?“ABC”:“XYZ”);
(我怀疑空检查的必要性)我担心人们可能会开始实际使用这些巴洛克风格的变体…@Holger有趣…我昨天也有同样的想法,但还是决定发帖子。问题是,如果你调用相同的方法只是根据条件更改参数,那么是的,不值得使用
分区方法根据条件应用不同的逻辑,那么我认为它非常有用。这就是我最初使用两个独立语句的想法。
u.isPresent()
?你的意思是
u.isActive()
?@JaroslawPawlak-是-谢谢你的提示-编辑。@JaroslawPawlak最初使用的问题
isPresent()
,但此后一直在编辑。此外,
setRole
方法更改为
setText
。@Holger我猜了那么多,但因为我懒得检查,我决定评论而不是编辑答案;)