如何在Kotlin中的对内Flatmap集合

时间:2017-06-02 17:39:33

标签: kotlin higher-order-functions flatmap

在这个例子中,我必须上课。

Order(selections: List<Selection>, discount: Double, ...)
Selection(productId: Long, price: Double, ...)

然后,我继续收集我想要计算价格的Order,需要使用Selection's priceOrder's discount。我怎么能这样做?

我尝试做以下事情,但似乎不可能。

val orderList: List<Order> = loadFromDB()

orderList.map { Pair(it.selections, it.discount) }  
.flatMap { /* Here I want to get list of Pair of selection from all orders with discount. */}

一旦我收集了Pair(Selection, discount),我就可以继续进一步计算了。 这可能以这种形式吗?我需要将链条分开吗?

2 个答案:

答案 0 :(得分:7)

要获得Pairs列表,您可以执行以下操作:

orderList.flatMap { order -> //flatMap joins multiple lists together into one
    order.selections.map { selection ->    //Map every selection into a Pair<Selection, Discount>
        Pair(selection, order.discount) }
    .map { pair -> /* Do your stuff here */ }

答案 1 :(得分:0)

@ D3xter的答案的替代语法,使用了更多的Kotlin糖:

1    orderList
2        .flatMap { order ->
3            order.selections.map { selection ->
4                order.discount to selection.price } 
5        .map { (discount, price) -> ... }

这利用了Kotlin的两个功能:

    第4行上的
  1. to中缀运算符,它是Pair的“工厂功能”
  2. Destructuring第5行的线对直接进入命名变量discountprice