Написание для l oop с .map () - PullRequest
       4

Написание для l oop с .map ()

4 голосов
/ 07 февраля 2020

У меня есть этот код, который реализуется с помощью для l oop. Я хотел написать это с помощью функции .stream и .map (). Я пытался использовать функцию .map (). Но, к сожалению, я получаю следующую ошибку:

Несовместимые типы. Обязательный список> но 'collect' был выведен для R: экземпляры (ы) переменных типа (типов) не существует, так что логическое значение соответствует переменной вывода List T с несовместимыми границами: ограничения равенства: нижние границы списка: Boolean

Вот старый код:

 public Iterable<Record> findAll(final List<Long> id) {
        final List<Record> result = new LinkedList<Record>();
        final List<List<Long>> partitions = ListUtils.partition(id, 10);
        for (List<Long> partition : partitions) {
            Iterables.addAll(
                    result,
                    this.repository.findAll(partition) 
            );
        }
        return result;
    }

Это код, когда я использую .map ()

   public Iterable<Record> findAll(final List<Long> id) {
        final List<Record> result = new LinkedList<Record>();
        final List<List<Long>> partitions = ListUtils.partition(id, 10);

         List<List<Long>> allPartitions = partitions.stream().map(partition ->{
            return Iterables.addAll(result, this.repository.findAll(partition));
        }).collect(Collectors.toList());

        return result;
    }

Любое предложение о том, как я могу это исправить? или на что мне стоит обратить внимание?

Ответы [ 2 ]

4 голосов
/ 07 февраля 2020

Предполагая, что this.repository.findAll(partition) возвращает Iterable<Record>, вы можете использовать

public Iterable<Record> findAll(final List<Long> id) {
    return ListUtils.partition(id, 10).stream()
        .flatMap(partition -> StreamSupport.stream(
                this.repository.findAll(partition).spliterator(), false))
        .collect(Collectors.toList());
}

Эта сложная конструкция Stream необходима, только когда findAll возвращает Iterable вместо Collection. Если он вернул Collection, вы могли бы просто использовать:

public Iterable<Record> findAll(final List<Long> id) {
    return ListUtils.partition(id, 10).stream()
        .flatMap(partition -> this.repository.findAll(partition).stream())
        .collect(Collectors.toList());
}

В связи с этим вы не должны накладывать такое же бремя на вызывающего вашего метода и рассмотреть возможность изменения типа возвращаемого значения с Iterable<Record> на Collection<Record> или даже List<Record>.

Другой вопрос, который необходимо рассмотреть, заключается в том, действительно ли выполнение этой операции в этих небольших фрагментах действительно имеет какую-либо выгоду, когда вы все равно извлекаете все записи.
Так почему бы просто используйте return this.repository.findAll(id);

1 голос
/ 07 февраля 2020

Полагаю, вы можете заменить l oop на forEach:

public Iterable<Record> findAll(final List<Long> id) {
    final List<Record> result = new LinkedList<Record>();
    final List<List<Long>> partitions = ListUtils.partition(id, 10);
    partitions.forEach(partition -> Iterables.addAll(result, this.repository.findAll(partition)));
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...