kotlinbeginner

Collection Builders — buildList, buildMap, buildSet

Build collections conditionally and dynamically with Kotlin collection builders.

kotlin
data class User(val name: String, val role: String, val active: Boolean)

fun main() {
    val isAdmin = true
    val showInactive = false
    val searchQuery = "ali"

    // buildList — conditional items
    val menuItems = buildList {
        add("Home")
        add("Profile")
        if (isAdmin) {
            add("Admin Panel")
            add("User Management")
        }
        add("Settings")
        add("Logout")
    }
    println("Menu: $menuItems")

    // buildMap — dynamic entries
    val config = buildMap<String, Any> {
        put("host", "localhost")
        put("port", 8080)
        put("debug", false)
        System.getenv("APP_ENV")?.let { put("env", it) }
        if (isAdmin) put("adminMode", true)
    }
    println("Config: $config")

    // buildSet — unique items
    val permissions = buildSet {
        add("read")
        add("write")
        if (isAdmin) {
            addAll(listOf("delete", "manage", "audit"))
        }
    }
    println("Permissions: $permissions")

    // Complex conditional building
    val users = listOf(
        User("Alice", "admin", true),
        User("Bob", "user", false),
        User("Charlie", "user", true),
        User("Diana", "admin", true)
    )

    val filteredUsers = buildList {
        addAll(users.filter { it.active || showInactive })
        if (searchQuery.isNotBlank()) {
            retainAll { it.name.contains(searchQuery, ignoreCase = true) }
        }
    }
    println("Filtered: $filteredUsers")

    // Build SQL-like query parts
    val conditions = buildList {
        add("active = true")
        if (searchQuery.isNotBlank()) add("name LIKE '%$searchQuery%'")
        if (isAdmin) add("role = 'admin'")
    }
    val sql = "SELECT * FROM users WHERE ${conditions.joinToString(" AND ")}"
    println("SQL: $sql")

    // Nested collection building
    val groups = buildMap<String, List<User>> {
        users.groupBy { it.role }.forEach { (role, roleUsers) ->
            put(role, buildList {
                addAll(roleUsers.filter { it.active })
                sortBy { it.name }
            })
        }
    }
    groups.forEach { (role, users) ->
        println("$role: ${users.map { it.name }}")
    }

    // buildString (related pattern)
    val report = buildString {
        appendLine("=== User Report ===")
        users.forEach { user ->
            append("  ${user.name}")
            append(" (${user.role})")
            if (!user.active) append(" [INACTIVE]")
            appendLine()
        }
        appendLine("Total: ${users.size}")
    }
    println(report)
}

Use Cases

  • Conditional list/map construction
  • Dynamic configuration building
  • SQL query part assembly

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.