使用 kotlin 过滤嵌套列表

use*_*265 1 kotlin

问题:我想过滤列表中的列表。我所有的数据模型都是不可变的。

我的 JSON 结构如下所示

{
  "root": [
    {
      "id": 2,
      "val": 1231.12,
      "fruit": [
        {
          "id": 2,
          "name": "apple"
        }
      ]
    },
    {
      "id": 3,
      "val": 1231.12,
      "fruit": [
        {
          "id": 2,
          "name": "apple"
        },
        {
          "id": 3,
          "name": "orange"
        }
      ]
    }
  ],
  "fruits": [
    {
      "id": 1,
      "name": "apple"
    },
    {
      "id": 2,
      "name": "guava"
    },
    {
      "id": 3,
      "name": "banana"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

问题陈述- 基本上,我想创建一个包含水果名称为苹果的所有根项目的列表。目前,我的天真解决方案看起来像这样。这涉及创建一个临时的可变列表,然后向其中添加特定项目。

下面的解决方案工作正常,但还有其他更好的方法来实现相同的目标。

val tempList = arrayListOf<RootItem>()

root?.forEach { item -> 
    item.fruit.filter {
        // filter condition
        it.id != null && it.name == "apple"
    }
    testList.add(item)
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ene 14

filterany将完成工作的组合:

val result = root?.filter { item -> 
    item.fruits.any { it.id != null && it.name == "apple" } 
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:您的解决方案不起作用。该filter函数确实返回了一个您没有使用的新列表。并且您总是将项目添加到列表中,而不仅仅是在谓词返回 true 时。