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来执行两个操作
如何以简洁的方式执行上述操作。下面的代码片段应该满足您的期望
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"));