Как мы выполняем итерацию по множественному списку и вызываем метод установки с использованием потоков java - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть 2 списка.

List<Email> emailList emailList = getEmails();
List<FileData> fileList = getFileList();
public class Email {

    private String email;
    private String name;
    private String type;
    private Set<Permissions>;

    //getter and setter
}
public class Permissions {

    private String permissionType;
    private String level;

    //getter and setter
}
public class FileData {

    private String email;
    private String type;

    //getter and setter
}

Мне нужно выполнить итерацию по списку, чтобы найти электронное письмо из списка и вызвать метод setPermissionType (), и если нет совпадения с электронным письмом, которое нужно выдать NotFoundException. Как мы можем сделать это с Java потоками?

Лог c, который у меня на данный момент есть.

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);
}

В вышеприведенных логах c Я делаю БД звонит в течение l oop. Я должен избежать этого, используя предложение IN.

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

1 Ответ

0 голосов
/ 19 февраля 2020

Прежде всего, я бы предложил удалить emailDao.findByEmail () внутри al oop, это потребует огромных затрат и технического долга

  1. Прежде всего, создайте список электронных писем

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

  2. Создать новый метод findByEmails (Список электронных писем) для поиска по нескольким электронным письмам.

    List<Email> emails = emailDao.findByEmails(emailIds);

  3. Я думаю, что-то подобное будет работать

    emails.forEach(email-> 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, так как мы повторяете только по уже существующим электронным письмам.

...