【问题标题】:Find if an element with a specific property value is found in a list查找是否在列表中找到具有特定属性值的元素
【发布时间】:2020-06-11 15:57:07
【问题描述】:

我正在尝试在 kotlin 的对象列表中查找一个值,为此使用“过滤器”,但如果找到该值,我需要返回 true 或 false,但过滤器会返回我的对象​​列表匹配的情况。

t.filter { it.retailerId == value }

¿当我在对象列表中找到该值时如何返回布尔值?

【问题讨论】:

  • 你可以使用t.any { it.retailerId == value }

标签: list kotlin find contains


【解决方案1】:

您可以将firstOrNull() 与特定谓词一起使用:

val found = t.firstOrNull { it.retailerId == value } != null

如果firstOrNull() 没有返回null,则表示找到了值。

【讨论】:

  • 也不错,但如果可能的话,我正在寻找一种返回布尔值的方法。谢谢
  • t.firstOrNull { it.retailerId == value } != null 返回一个布尔值。如果您的意思是直接返回布尔值的方法,请查看any()
  • 请注意,如果列表可以为空并且谓词可能在 null 引用上返回 true,则它会变得模棱两可。
【解决方案2】:

如果你需要元素正好是一个:

t.filter { it.retailerId == value }.size == 1

如果没有:

t.any { it.retailerId == value }

使用 foldRight 并在找到时休息一下:

t.foldRight(false) {val, res ->
                if(it.retailerId == value) {
                    return@foldRight true
                } else {
                    res
                }
            }

【讨论】:

  • 我正在搜索一个布尔值,因为我将在一行中集成另一个方法。
  • @VíctorMartín 我用 foldR 添加了另一个例子,它也返回一个布尔值
【解决方案3】:

除了firstOrNull,您还可以将any 与相同的谓词一起使用:

val found = t.any { it.retailerId == value }

【讨论】:

    【解决方案4】:

    Kotlin 有这个不错的扩展功能,你可以使用

    if (none { it.isSelected == true }) {
                    first().isSelected = true
                }
    

    【讨论】:

      【解决方案5】:

      对于单个元素

      list.first { it.type == 2 (eg: conditions) } 
      or
      list.firstOrNull { it.type == 2 (eg: conditions) }
      

      对于元素列表

      list.filter { it.type == 2 (eg: conditions) }
      

      【讨论】:

        猜你喜欢
        • 2013-04-24
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-25
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        相关资源
        最近更新 更多