我有一个要求,我需要根据两个条件从另一个列表创建对象列表。 对象要么处于 session 状态,要么处于事件状态。 [这个问题隐约与-Create list of object from another using java8 streams相关。
class Person
{
private String firstName;
private String lastName;
private String personId;
//Getters and Setters
}
class UserInfo
{
private String uFirstName;
private String uLastName;
private String userId;
//Constructor, Getters and Setters
}
主类:
Boolean isActiveUser = ..... [getting from upstream systems]
HttpSession session = request.session();
List<String> sessionUserIds = session.getAttribute("users");
List<Person> personList = criteria.list(); //Get list from db.
//CURRENT COCDE
List<UserInfo> userList = new ArrayList<>();
for(Person person: personList) {
UserInfo userInfo = new UserInfo(person);
if(sessionUserIds.contains(person.getPersonId())){
userInfo.setLoginTime(""); //Get LoginTime from upstream
userInfo.setIdleTime(""); // Get IdleTime from Upstream
userList.add(userInfo);
} else {
if(isActiveUser) {
userList.add(userInfo);
}
}
}
// Trying to GET IT converted to JAVA-8
List<UserInfo> userList = personList.stream()
.filter(p -> ??)
.map( ??
.collect(Collectors.toList());
如有任何帮助,我们将不胜感激。
最佳答案
是否要调整 session 用户 ID 列表中的所有用户的数据,而不调整其他用户的数据?也许以下内容对您来说没问题(假设,正如您在其他地方所说的那样, getPersonId()
返回与 getUserId()
相同的结果):
List<UserInfo> userList;
userList = personList.stream()
.filter(p -> isActiveUser || sessionUserIds.contains(p.getPersonId()))
.map(UserInfo::new)
.collect(Collectors.toList());
userList.stream()
.filter(u -> sessionUserIds.contains(u.getUserId())
.forEach(u -> {
u.setLoginTime(""); // Get LoginTime from upstream
u.setIdleTime(""); // Get IdleTime from Upstream
});
请务必阅读foreach
javadoc .
或者仅使用一个流:
List<UserInfo> userList;
userList = personList.stream()
.filter(p -> isActiveUser || sessionUserIds.contains(p.getPersonId()))
.map(p -> {
UserInfo u = new UserInfo(p);
if (sessionUserIds.contains(u.getUserId())) {
u.setLoginTime(""); // Get LoginTime from upstream
u.setIdleTime(""); // Get IdleTime from Upstream
}
return u;
})
.collect(Collectors.toList());
我建议您在映射之前进行过滤。对我来说,它更具可读性。这绝对不是对每个人来说都是如此。当在心里调试该代码时,至少我可以过滤掉一些已经存在的元素,并专注于进一步处理中重要的事情。
关于lambda - 使用具有自定义条件的 java8 流从另一个对象创建对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49385959/