Kotlin结合了arrow,lamda,?,。的用法。 , 然后让。啥意思?

时间:2019-08-14 18:29:57

标签: kotlin

=INDEX(D1:E4,MATCH(TRUE,ISNUMBER(SEARCH(A2,D1:D4)),0),MATCH("text to return",D1:E1,0))

对于上面的kotlin函数,我的问题顺序从内部块代码到外部块: 1. fun theItemDTO.toDomainModel( domainOrderId: String, pIds: List<Long> = emptyList() ): theItem = let { dto -> OrderProtoBuilders.theItem { this.id = dto.id.toString() skuId = dto.catalogEntryId.toString() orderId = domainOrderId quantity = dto.quantity unitPrice = dto.unitPrice totalPrice = dto.totalPrice price = null for (pId in pIds) addpId(pId.toString()) dto.someMap[MAP_A] ?.let(::setAId) dto.someMap[MAP_B] ?.let(::setBId) } } 在做什么?它看起来像是dto.someMap[MAP_A] ?.let(::setAId)的重新分配,但也声明了someMap[MAP_A]的某些内容……它在做什么?

  1. 如此多的let包装器的含义与{相同。正确?因为我确实读过return,所以就像自动返回值的函数。那么->的最终值真的是...: theItem创建的内容吗?
OrderProtoBuilders.theItem {...

1 个答案:

答案 0 :(得分:2)

  1. dto.someMap[MAP_A]?.let(::setAId)可以像
  2. 那样展开
val value = dto.someMap[MAP_A]
if (value != null) {
    setAId(value)
}

2。 是的,这是正确的。你可以这样想

//the whole function will return item created by OrderProtoBuilders.theItem
fun theItemDTO.toDomainModel(
    domainOrderId: String,
    pIds: List<Long> = emptyList()
): theItem = let { dto ->
    //return OrderProtoBuilders.theItem
    OrderProtoBuilders.theItem {
        //do some additional initialization of the Item
    }
}