我的第一个列表包含对象用户列表,
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);
}
}
}
}
}
}
最佳答案
存在三个嵌套:帐户 Range
、UserDetails
和用户 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/