Java 8 Java8流条件处理

Java 8 Java8流条件处理,java-8,java-stream,Java 8,Java Stream,我有一个用户对象列表 public class User{ private String name; private String role; private String status; } 我想使用流API来执行两个操作 查看列表的用户名是否为“Admin”,如果不抛出自定义异常(例如UserNotFoundException) 如果列表中有用户名“Admin”,则将该用户的状态标记为“Active”,其余所有用户的状态标记为“InActive” 如何以简洁的方式执行上述操作。下面的

我有一个用户对象列表

public class User{
 private String name;
 private String role;
 private String status;
}
我想使用流API来执行两个操作

  • 查看列表的用户名是否为“Admin”,如果不抛出自定义异常(例如UserNotFoundException)
  • 如果列表中有用户名“Admin”,则将该用户的状态标记为“Active”,其余所有用户的状态标记为“InActive”

  • 如何以简洁的方式执行上述操作。

    下面的代码片段应该满足您的期望

    List<User> userList = Arrays.asList(new User("Admin", null, "Draft"),
            new User("User", null, "Draft"));
    
    userList.stream()
    .filter(u -> u.name.equals("Admin"))
    .peek(v -> userList.forEach(u -> u.status = u.name.equals("Admin") ? "Active" : "Inactive"))
    .findAny()
    .orElseThrow(IllegalArgumentException::new);
    
    userList.forEach(System.out::println);
    

    你可以分两步来做,1。筛选wi admin并在不匹配时引发异常 2.更新状态

    users.stream()
        .filter(user -> user.name.equals("Admin"))
        .findAny().orElseThrow(UserNotFoundException::new).setStatus("Active");
    users.stream()
        .filter(user -> !user.name.equals("Admin"))
        .forEach(user -> user.setStatus("Inactive"));
    

    这不管用。在
    筛选(u->u.name.equals(“Admin”))
    之后,后续操作只处理匹配的元素。因此,
    u.name.equals(“Admin”)
    检查
    peek
    是没有意义的;这只能是真的。此外,
    findAny()
    在找到匹配项时停止处理元素。@Holger,在
    peek
    中,我再次调用
    userList.forEach()
    好的,我忽略了这一点,因为我无法想象有人会真的这样做。这并没有让事情变得更好。若并没有找到管理员,它仍然并没有处理任何元素。我认为你们不能在单行流中完成你们的任务。分两步做。1-
    if(users.stream().noneMatch(user->user.getName().equals(“Admin”))抛出新的UserNotFound()
    2-
    users.replaceAll(user->user.setStatus(user.getName().equals(“Admin”)?“ACTIVE”:“INACTIVE”);返回user;})
    
    users.stream()
        .filter(user -> user.name.equals("Admin"))
        .findAny().orElseThrow(UserNotFoundException::new).setStatus("Active");
    users.stream()
        .filter(user -> !user.name.equals("Admin"))
        .forEach(user -> user.setStatus("Inactive"));