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

标签 lambda java-8 java-stream

我有一个要求,我需要根据两个条件从另一个列表创建对象列表。 对象要么处于 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/

相关文章:

C++ lambdas, "error: expected expression"

Java Lambda 方法引用 - 需要清楚

java - 方法 "reference to an instance method of an arbitrary object of a particular type"如何解析任意对象?

java - 在流管道中放置 parallel() 调用的位置重要吗?

java - 获取供应商流的最小值和最大值

java - 使用流 API 分组时多个组中的单个元素

python - 如何通过与条件匹配的值来过滤列表中的字典?

java - 如何使用 Java 中结果列表本身的属性来过滤目录列表?

java - 基于时间的流媒体

java - Parallel Stream 给出空项,如何在 Java 8 中执行