java - 如何使用流比较两个列表?

标签 java java-8 java-stream

我的第一个列表包含对象用户列表,

List<UserDetails> resultUesrList=array.stream().map(result>parseObject(result)).collect(Collectors.toList());

列表用户中的每个对象都包含列表范围:

//Retrieve user ranges details 
    List<Range> ranges=user.getRanges();

在另一边我有其他列表

account.getRanges()

我想要 forloop 用户列表,然后获取每个用户的范围,然后使用流将 user 中的每个范围与 account.getRanges() 中的所有范围进行比较。

我不知道如何在流中执行此操作,但正如最初我所做的那样,下面的操作是正确的以及如何相互比较:

resultUesrList.stream().flatMap(user->user.getRanges().stream().map(i->i)).collect(Collectors.toList());
account.getRanges().stream().map(j->j).collect(Collectors.toList());

为了更清晰,我用传统方式编写代码:

    private void fillUsersAccount(Account account,String companyID) throws Exception {

    //call IAM to get company details
    ApplicationResponse response = RESTServiceUtils.callService(ApplicationContextProvider.getApplicationContext().getBean(EnvironmentConfig.class).getAccountURL()+companyID, false, false, null, ApplicationResponse.class);  
    Object companyObjectDetails = response.getResult();
    ArrayList<?> array =(ArrayList<?>)companyObjectDetails;  
    List<UserDetails> resultUesrList=array.stream().map(result->parseObject(result)).collect(Collectors.toList());

    //get list of users 
    for(int i=0;i<resultUesrList.size();i++) {              
        //get user details
        UserDetails user=resultUesrList.get(i);             
        //Retrieve user ranges details 
        List<Range> ranges=user.getRanges();    
        //get ranges in user
        for(int j=0;j<ranges.size();j++) {                  
            //get range user 
            Range rangeUser=ranges.get(j);                  
            //get ranges inner account 
            for (Range rangeOuter : account.getRanges()) {                      
                //check if range id equals and type range
                if(rangeUser.getRangeId().equals(rangeOuter.getRangeId()) && rangeUser.getRangeType().equals(rangeOuter.getRangeType()))    {                       
                    if(rangeOuter.getUsers()!=null) {
                        rangeOuter.getUsers().add(user);
                    }else {
                        List<UserDetails> users=new ArrayList<UserDetails>();
                        users.add(user);
                        rangeOuter.setUsers(users);
                    }                                               
                }                   
            }               
        }                       
    }                   
}

最佳答案

存在三个嵌套:帐户 RangeUserDetails 和用户 Range,因此不容易一次性完成。将独立的部分分解为处理细节的方法会更容易。

此外,您希望构建新的 Range 来添加回您的帐户,而不是修改现有的 Range

List<Range> newAccountRanges = account.getRanges().stream()
  .map( accountRange -> new Range( 
    accountRange.getRangeId(),
    accountRange.getRangeType(),
    findMatchingUsers( accountRange ) ) )
  .collect( Collectors.toList() );
...
List<UserDetails> findMatchingUsers( Range forAccount ) {
  resultUesrList.stream()
    .filter( user -> user.getRanges().stream()
       .anyMatch( userRange -> checkRange( forAccount, userRange ) )
    .collect( Collectors.toList() );
...
boolean checkRange( Range forAccount, Range forUser ) {
  return forAccount.getRangeId().equals( forUser.getRangeId() ) &&
    forAccount.getRangeType().equals( forUser.getRangeType() );
}

关于java - 如何使用流比较两个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49039137/

相关文章:

java - 我的Android应用程序在某些设备上崩溃到java.lang.RuntimeException吗?

java - 从 IntStream 对象中的 mapToObj 函数返回 Callable<Double> 列表

java - REST 没有参数值?

java - 如何提供 lambda 映射函数作为方法参数?

java - 将包含空格分隔数字的字符串转换为整数数组

java - 尝试使用 java 应用程序连接 mySQL 数据库一直遇到困难

java - 如何将位图图像的注册点设置为底部中心?

Java计算整数数组中每个元素的出现次数

java - 理解 Stream.generate 静态方法签名的问题

java - 如何从迭代器创建 Java 8 Stream?