【问题标题】:Kotlin: using .contains() for nested attributesKotlin:对嵌套属性使用 .contains()
【发布时间】:2020-05-10 14:37:11
【问题描述】:

是否可以使用 .contains() 方法来检查具有相同 id 的对象而不分配提到的Tasks ...

 ... arrayListOf<OrderSmallDTO> to arrayListOf<int>?


        private var mentionedTasks = arrayListOf<OrderSmallDTO>()

        composite.add(repository.getOrders(params)
                .subscribe({orders ->
                    orders.tasksList.forEach { order ->
                        if (!mentionedTasks.contains(order.id)) {
                            mentionedTasks.add(order)
                        }
                    }
                    checkForDelay()
                }, {}))

OrderSmallDTO 包含 id 字段以及许多其他字段

【问题讨论】:

标签: kotlin


【解决方案1】:

我不确定我是否正确理解了您的问题。 “不分配提到的任务”是什么意思?

不管我相信这可以解决你的问题:

    private var mentionedTasks = arrayListOf<OrderSmallDTO>()

    composite.add(repository.getOrders(params)
            .subscribe({orders ->
                orders.tasksList.distinctBy(OrderSmallDTO::id).forEach { order ->
                    mentionedTasks.add(order)
                }
                checkForDelay()
            }, {}))

如果后面提到的Tasks没有被修改,我建议你使用这样的不可变List:

    private var mentionedTasks = emptyList<OrderSmallDTO>()

    composite.add(repository.getOrders(params)
            .subscribe({orders ->
                mentionedTasks = orders.tasksList.distinctBy(OrderSmallDTO::id)
                checkForDelay()
            }, {}))

如果您以后确实想将其他任务添加到列表中,那么列表不是合适的类型。您应该改为使用地图。请参阅下面的示例。请注意,我假设 order.id 的类型为 Int

    private var mentionedTasks = mutableMapOf<Int, OrderSmallDTO>()

    composite.add(repository.getOrders(params)
            .subscribe({orders ->
                mentionedTasks.putAll(orders.tasksList.map {Pair(it.id, it)})
                checkForDelay()
            }, {}))

如果您需要将上述任务作为列表,您可以调用mentionedTasksById.values.asList()

【讨论】:

  • 它有效,但仅适用于提及任务不断更新的单个调用,我需要确保在所有调用中没有两个具有相同 ID 的字段
  • 通过将提到的Tasks分配给一个新的数组iment从所有提到的Tasks中提取id字段并将它们分配给一个包含整数的新数组
【解决方案2】:

解决方案 1

使用!in 映射ID 集合

if (order.id !in mentionedTasks.map{ it.id }) {
   mentionedTasks.add(order)
}

解决方案 2

将 contains 用于映射的 id 集合

if (!mentionedTasks.map{ it.id }.contains(order.id)) {
   mentionedTasks.add(order)
}

解决方案 3

OrderSmallDTO 覆盖equalshashCode 以检查id 字段,以实现此目的:

if (mentionedTasks.contains(order)) {
   mentionedTasks.add(order)
}

【讨论】:

  • 虽然所有提议的解决方案都解决了最初的问题,但出于性能考虑,我强烈建议使用地图或集合而不是使用列表。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多