我们如何遍历muliple列表并使用java流调用setter方法

我们如何遍历muliple列表并使用java流调用setter方法,java,java-stream,Java,Java Stream,我有两张清单 List<Email> emailList emailList = getEmails(); List<FileData> fileList = getFileList(); 我需要迭代列表匹配列表中的电子邮件并调用setPermissionType()方法,如果与电子邮件不匹配,则需要抛出NotFoundException。我们如何使用Java流实现这一点 我现在的逻辑是 for (final FileData fileData: fileList )

我有两张清单

List<Email> emailList emailList = getEmails();
List<FileData> fileList = getFileList();
我需要迭代列表匹配列表中的电子邮件并调用setPermissionType()方法,如果与电子邮件不匹配,则需要抛出NotFoundException。我们如何使用Java流实现这一点

我现在的逻辑是

for (final FileData fileData: fileList ) {
    Email email= emailDao.findByEmail(fileData.getEmail()); //throws NotFoundException
    final Set<Permissions> permissions = email.getPermissions();
    permissions.removeIf(p -> p.getPermissionType() == fileData.getType());
    email.setPermissions(permissions);
}
for(最终文件数据:文件列表){
Email-Email=emailDao.findByEmail(fileData.getEmail());//抛出NotFoundException
最终设置权限=email.getPermissions();
permissions.removeIf(p->p.getPermissionType()==fileData.getType());
设置权限(权限);
}
在上面的逻辑中,我在for循环中进行DB调用。我需要使用IN子句来避免这种情况

List<String> emailStringList = fileList.stream()
                                       .map(file -> Objects.toString(file.getEmail()))
                                       .collect(Collectors.toList());
List<Email> emailList= emailDao.findByEmailIn(emailStringList);
List emailStringList=fileList.stream()
.map(文件->对象.toString(文件.getEmail()))
.collect(Collectors.toList());
List-emailList=emailDao.findByEmailIn(emailStringList);

首先,我建议在循环中删除emailDao.findByEmail(),这将花费您巨大的成本和技术债务

  • 首先,创建一个电子邮件列表

    List emailIds=fileList.stream().map(fileData->fileData::getEmail).collect(Collectors.toList())

  • 创建一个新方法findByEmails(列出电子邮件)以通过多封电子邮件查找

    List emails=emailDao.findByEmails(emailid)

  • 我想,像这样的东西会管用的

    emails.forEach(电子邮件->
    email.setPermissions(email.getPermissions().stream().fiter(permission->!permission.getType().equals(fileList.stream().filter(file->file.getEmail().equals(email.getEmail()).findFirst().orElse(new permission()).getType()))


  • 此外,我认为这将消除NotFoundException,因为我们只在已经存在的电子邮件上进行迭代。

    您现在的逻辑似乎清晰易读。为什么要将其转换为Java streams?您使用“contactPermissions”设置权限,它不应该只是“Permissions”吗?@realponsign流是否会使这变得更复杂?我只是想知道是否有比我现有的更好的解决方案。流通常不是一个进行更改的好解决方案,而且对于检查过的异常非常糟糕。当然不应该仅仅因为它们是新的就使用它们。侧栏:使用
    String.equals
    (而不是==)来比较字符串
    public class FileData {
    
        private String email;
        private String type;
    
        //getter and setter
    }
    
    for (final FileData fileData: fileList ) {
        Email email= emailDao.findByEmail(fileData.getEmail()); //throws NotFoundException
        final Set<Permissions> permissions = email.getPermissions();
        permissions.removeIf(p -> p.getPermissionType() == fileData.getType());
        email.setPermissions(permissions);
    }
    
    List<String> emailStringList = fileList.stream()
                                           .map(file -> Objects.toString(file.getEmail()))
                                           .collect(Collectors.toList());
    List<Email> emailList= emailDao.findByEmailIn(emailStringList);