【问题标题】:How to replace long chain of forEach{} statements in Kotlin?如何替换 Kotlin 中的长链 forEach{} 语句?
【发布时间】:2019-09-13 08:45:53
【问题描述】:

我正在处理这样一种情况,即我在我的活动中收到一个与我的房间数据库中的其他对象有许多关系的一般对象。我需要访问一个低级对象,并且必须使用 forEach 进行多次迭代,例如:

items.forEach{ item -> 
   item.categories.forEach{ category ->
      category.dataTypes.forEach{ dataType ->
         dataType.configValues.forEach{ value ->
            if (value) (...) 
         }
      }
   }
}

这样一连串的陈述感觉很烦人。不知何故,它看起来像是糟糕的代码。有没有办法减少 Kotlin 中的这种样板?

【问题讨论】:

  • 取决于你在里面做什么......但是flatMap结合filter可能会奏效......基本上这取决于你是否仍然需要来自外部循环的值...... ..

标签: kotlin lambda foreach


【解决方案1】:

以前的平面映射怎么样?

items.flatMap { it.categories }
    .flatMap { it.dataTypes }
    .flatMap { it.configValues }
    .filter { ... your filter ... }
    .forEach { ... }

链条实际上仍然存在,但已变平。

【讨论】:

  • 每次对集合调用flatMap 时,都会创建一个新集合,这可能会严重影响性能。所以我建议首先调用asSequencecollectionMap 而不是flatMap 其中collectionMapinline fun <T, R> Sequence<T>.collectionMap(crossinline transform: (T) -> Collection<R>) = flatMap { transform(it).asSequence() }
猜你喜欢
  • 2014-09-02
  • 2014-05-28
  • 2020-06-22
  • 2012-10-02
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多