当前位置: 首页 > 知识库问答 >
问题:

使用具有自定义条件的java8流从另一个对象创建对象列表

凤晨朗
2023-03-14

我有一个要求,我需要根据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());

任何帮助都将不胜感激。

共有3个答案

林烨烨
2023-03-14

不是一个很好的主意,但只是一个尝试。

如果人成为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);
                }
          }
      });
卢书
2023-03-14

您可以创建流,然后检查用户是否处于活动状态或在会话中,然后如果用户在会话中,则使用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());
郑富
2023-03-14

是否要调整会话用户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
        });

请务必阅读foreachjavadoc。

或者仅使用一个流:

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实现这一点吗? 附注:我不会预先知道这些对象的名称是什么值。