我有一个要求,我需要根据2个条件从另一个列表中创建一个对象列表。对象应处于会话中或处于活动状态。[这个问题与使用java8流从另一个对象创建对象列表有着模糊的联系
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());
任何帮助都将不胜感激。
不是一个很好的主意,但只是一个尝试。
如果人成为userId,那么你可以尝试如下:
List<UserInfo> userList = new ArrayList<>();
personList.stream()
.map(p -> new UserInfo(person)) // person becomes user here
.forEach(u -> {
if(sessionUserIds.contains(u.getUserId())){
userInfo.setLoginTime("");
userInfo.setIdleTime("");
userList.add(userInfo);
} else if(isActiveUser) {
userList.add(userInfo);
}
}
});
您可以创建流,然后检查用户是否处于活动状态或在会话中,然后如果用户在会话中,则使用setter并最终收集。
List<UserInfo> userList = personList.stream()
.map(UserInfo::new)
.filter(userInfo -> isUserActive || sessionUserIds.contains(userInfo.getUserId()))
.map(userInfo -> {
if(sessionUserIds.contains(userInfo.getUserId())) {
userInfo.setLoginTime("");
userInfo.setIdleTime("");
}
return userInfo;
})
.collect(Collectors.toList());
或者如果您不介意在过滤器中使用setter。
List<UserInfo> userList = personList.stream()
.map(UserInfo::new)
.filter(userInfo -> {
if (sessionUserIds.contains(userInfo.getUserId())) {
userInfo.setLoginTime("");
userInfo.setIdleTime("");
return true;
}
return isUserActive;
})
.collect(Collectors.toList());
是否要调整会话用户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());
我建议在映射之前进行过滤。对我来说,它更具可读性。这绝对不是每个人都这样。在精神上调试代码时,至少我可以过滤掉一些已经存在的元素,集中精力处理在进一步处理中重要的事情。
我试图理解Java8流。我有两门课: 以及: 字段应指示全天的卡路里总量是否为。该字段与当天的所有条目相同。 我试图从
我有一个学生名单a和学生名单B。 学生对象包含如下字段:否、年龄、城市、出生日期、工资 我的列表A包含这些对象 我的列表B包含这些对象 我想做的是提取ListA有但listB没有的学生对象,以及ListA和listB有但薪水不同的学生对象(如否、年龄、城市)。我还想写工资差异。 我想在java 8中使用流api。首先,我想将students对象提取到列表中,但我现在可以提取常见的student对象
我有两个包含该类对象的列表: 我想通过学生比较一下那两个列表中的对象。我得比较一下列表然后得到下面的数据 我需要创建一个新列表,其中包含中存在但不在中的 对象 我需要创建一个新列表,其中包含那些对象,这些对象存在于中,但不存在于中 我需要创建一个新列表,其中包含使用java8流出现在两个列表中的对象 我尝试使用下面的代码 查找获得TC的学生(存在于列表1中但不存在于列表2中) 查找新的许可(存在于
问题内容: 我有以下Java6和Java8代码: Java8中有什么方法可以使用Lambda以更简洁的方式处理前一个问题? 问题答案: 流绑定到给定的可迭代/集合,因此您不能真正地“并行”迭代两个集合。 一种解决方法是创建索引流,但不一定比for循环有所改进。流版本可能如下所示:
我有一个的列表 其中是一个模型类,如下所示 null
我需要从给定的超级列表中提取子列表,如下所述。 假设我有一个“Person”对象的超级列表如下: 让Person类定义如下: 通过使用Java Streams API,我如何获取包含如下条目的子列表(注意,必须获取具有相同名称的对象的重复实例): 有人能帮我用Java 8流API实现这一点吗? 附注:我不会预先知道这些对象的名称是什么值。