Kotlin Как использовать потоки Java .map () в kotlin для сопоставления ответа другого объекта - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь отобразить массив объектов в другой массив с другими типами объектов, я использовал для этого использование потоков в Java 8, это было довольно просто, создать экземпляр объекта, установить его значения и вернуть объект.Я только что перешел на Kotlin, и иногда мне бывает сложнее делать подобные операции.Все примеры, которые я нашел, очень просты и не могут найти то, что я хочу.

У меня есть этот класс BalanceMap:

data class BalanceMap @JsonCreator constructor( var balType: String, var value: Any )

Я получаю данные из Интернетаservice.

val balances: List<AcctBal> = res.getAcctBals();

класс AcctBal выглядит следующим образом

public class AcctBal {

  @SerializedName("CurAmt")
  @Expose
  private CurAmt curAmt;

  @SerializedName("Desc")
  @Expose
  private String desc;

  @SerializedName("ExpDt")
  @Expose
  private LocalDateTime expDt;
}

и попытайтесь сопоставить этот ответ с var balanceList: List<BalanceMap>

balances.map {}

-> var balanceList: List<BalanceMap> = balances.map { t -> fun AcctBal.toBalanceMap() = BalanceMap( balType = "", value = "" )}

Я хочу сделать что-то вроде этого:

List<ProductDetail> details = acctBal.stream().filter(f -> f.getBalType() != null).map(e -> {
                String bal = e.getBalType();
                if (avalProductInfo.getBankId().equals("00010016")) {
                    bal = e.getBalType();
                }
                ProductDetail detail = new ProductDetail();
                detail.setItem(bal);
                if (e.getCurAmt() != null) {
                    detail.setValue(e.getCurAmt().getAmt().toString());
                } else if (e.getRelationDt() != null) {
                    detail.setValue(e.getRelationDt().toGregorianCalendar().getTimeInMillis());
                } else if (e.getMemo() != null) {
                    detail.setValue(e.getMemo());
                }
                return detail;
            }).collect(toList());

Я экспериментировал, но всегда ошибался, любая помощь будет высоко оценена.Удачного кодирования!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Спасибо @Hakob Hakobyan за указание в правильном направлении,

Я оставил свое решение так:

fun mapRs(rs: AthProductResponse): BalanceByAccountRs {
    val res = rs.getPartyAcctRelRec();
    val balances: List<AcctBal> = res.getAcctBals();
    val account = Account(res.getPartyAcctRelInfo().depAcctId.acctId, res.getPartyAcctRelInfo().depAcctId.acctType)
    var balanceList: List<BalanceMap> = balances
        .filter { f -> f.getDesc() != null }
        .map { it -> mapToProductDetail(it) }
        .toList()
    return BalanceByAccountRs(account, balanceList)
}

fun mapToProductDetail(bal: AcctBal): BalanceMap {
    var propertyValue: Long = 0L;
    if(bal.getExpDt() != null) {
        propertyValue = Timestamp.valueOf(bal.getExpDt()).getTime()
    } else {
        propertyValue = bal.getCurAmt().getAmt().toLong()
    }
    return BalanceMap(bal.getDesc(), propertyValue)
}

На всякий случай, если кто-то проходит через то же самое.Счастливого кодирования

0 голосов
/ 18 февраля 2019

несколько быстрых прототипов

    details  = acctBal
                     .stream()
                     .filter{ f -> f.getBalType() != null }
                     .map { it -> mapToProductDetail (it) }
                     .collect() 

Вы можете посмотреть здесь

...