Ошибка получения несовместимых типов при попытке сопоставления списка - PullRequest
3 голосов
/ 10 июля 2019

У меня есть список FeeAccount, который я хотел бы заполнить. Я хочу использовать .stream.map (), чтобы сделать это. Мне удалось создать метод, который отображал бы мой список и возвращал его. Я написал этот код, используя некоторые другие примеры, которые я нашел в Интернете. Моя проблема в том, что каким-то образом он возвращает список, который несовместим со списком.

Я получаю ошибку: Несовместимые типы. Обязательный список, но «карта» выведена для потока: не существует экземпляров типа переменной (ей) R, поэтому поток соответствует списку

Как я понимаю, проблема в части, где я использую collect (Collectors.toList ()) . Но я не уверен. Я даже не совсем понимаю, что означает сообщение об ошибке.

Может быть, кто-то может объяснить, что я делаю не так? Это с .stream.map ()? Потому что я никогда не использовал это раньше. Или, может быть, проблема в другом.

Method(List<contract> contractList){
 List<FeeAccount> feeAccounts = new ArrayList<>();

    feeAccounts = contractList
            .stream()
            .map(contract -> {

                List<Fee> monthlyFees=...;

                return monthlyFees.stream()
                        .map(monthlyFee -> {
                            FeeAccount account = new FeeAccount();
                            account.setFeeCode(monthlyFee.getFeeCode());
                            account.setDebtorAccount(contract.getDebtorAccount());
                            return account;
                        }).collect(Collectors.toList());
            });}

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

У вас есть две вложенные map операции. Внешний преобразует contract в List<FeeAccount>, а внутренний преобразует Fee в FeeAccount.

Следовательно, ваш конвейер приводит к Stream<List<FeeAccount>> без операции терминала.

Если вы добавите .collect(Collectors.toList()) в конце, вы получите List<List<FeeAccount>>.

Если вы хотите объединить все эти внутренние списки в один выходной список, вы должны использовать flatMap.

Для получения квартиры List:

List<FeeAccount> feeAccounts = 
    contractList.stream()
                .flatMap(contract -> {
                    List<Fee> monthlyFees=...;
                    return monthlyFees.stream()
                                      .map(monthlyFee -> {
                                          FeeAccount account = new FeeAccount();
                                          account.setFeeCode(monthlyFee.getFeeCode());
                                          account.setDebtorAccount(contract.getDebtorAccount());
                                          return account;
                                      });
                })
                .collect(Collectors.toList();
1 голос
/ 10 июля 2019

map() является промежуточной операцией в поточном конвейере (пожалуйста, посмотрите на Потоковые операции и конвейеры ), что означает, что он возвращает поток.

feeAccounts = contractList
           .stream()
           .map(...) // result of this operation is Stream<<List<FeeAccount>> 
and not a List<FeeAccount>

Вам не хватает операции терминала, например .collect(Collectors.toList():

List<FeeAccount> feeAccounts = contractList
           .stream()
           .flatMap(monthlyFees -> monthlyFees.stream()
                        .map(monthlyFee -> {
                            FeeAccount account = new FeeAccount();
                            account.setFeeCode(monthlyFee.getFeeCode());
                            account.setDebtorAccount(contract.getDebtorAccount());
                            return account;
                        })
           .collect(Collectors.toList());

flatMap превращает Stream<Stream<FeeAccount>> в просто Stream<FeeAccount>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...