【问题标题】:Predicates in nested list kotlin嵌套列表kotlin中的谓词
【发布时间】:2021-06-01 10:13:53
【问题描述】:

我有一个 JSON 列表,我需要在其中根据一些过滤器过滤数据。 我正在使用谓词进行过滤,但根据我的需要,我需要过滤嵌套列表,如果在这里我使用谓词,我会留下 3 个测试谓词 Any, None, and All 但因为我只想要匹配的数据并且我没有得到使用任何这些谓词。

Any 如果至少有一个匹配元素返回 true,All 如果存在所有匹配元素则返回 true 但是我如何才能从嵌套列表中只获取匹配的元素而不管任何不匹配的元素.

我可以使用循环列表的传统方法,但我想知道是否可以使用谓词。

这是示例 JSON 我正在尝试获取其会话元素包含 min_age_limit is > 18available_dose_1 > 0 的中心。

{
"centers": [
    {
        ....
        "sessions": [
            {
                "session_id":"adad",
                ...
                "min_age_limit":45,
                "available_capacity_dose1": 5,
                "available_capacity_dose2": 5
                ...
            },
            {
                "session_id":"adad1",
                ...
                "min_age_limit":18,
                "available_capacity_dose1": 0,
                "available_capacity_dose2": 5
                ...
            },
            {
                "session_id":"adad2",
                ...
                "min_age_limit":18,
                "available_capacity_dose1": 5,
                "available_capacity_dose2": 0
                ...
            }
        ]
    }
    ....
    ]
}

【问题讨论】:

    标签: android kotlin predicate


    【解决方案1】:

    你应该像下面这样使用 filter

    filteredList = sessions.filter{ it.min_age_limit > 18 && it.available_dose_1 > 0 } 
    

    为了澄清,Kotlin 支持 any、none 和 all 作为奖励谓词。但过滤器也在那里。我想这就是你要找的东西。

    【讨论】:

    • 感谢您的回复,但在这种情况下,JSON 包含每个中心的会话,所以我需要先遍历中心并向会话添加过滤器吗?请纠正我。 centers?.forEach { center -> center.sessions?.filter { session -> session.minAgeLimit > 18 && session.availableCapacityDose1 > 0 } }
    【解决方案2】:

    不能使用谓词。 我将列表转换为地图,然后添加过滤器。

    val allValidSessions = it?.data?.centers?.sortedBy { it.name }?.map { center ->
                    center to center.sessions?.filter { session -> isValidSession(session, 18, selectedDose) }
                }?.toMap()
    
    private fun isValidSession(session: Session, s: String, selectedDose: String): Boolean {
            if (session.minAgeLimit!! == s.toInt() && (if (selectedDose == "1") session.availableCapacityDose1!! > 0 else session.availableCapacityDose2!! > 0)) return true
            return false
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2013-04-03
      • 2017-07-16
      相关资源
      最近更新 更多