user9507356
user9507356

Reputation: 51

Traverse a list of filter to appy them

I have some filter on a list(10..1000). I would like to have a list of function objects, traverse this list and apply that filter to (10..1000). Maybe later choose some filters.

fun main(args: Array<String>) {
    var sol = (10..1000).toList().filter(lastDigitIsLength ).filter(no7andNo1 ).filter(isEvenAndGreater1).filter(first2DigitsOddCrossSumLess10 ).filter(isPrime )
println("The number is $sol")

}
/* The functions exist

Upvotes: 0

Views: 171

Answers (2)

Andrei Tanana
Andrei Tanana

Reputation: 8432

Sorry, maybe I misunderstand your question. Do you want to apply a list of filters to list of ints? If so, it can be done like this:

fun filter(list: List<Int>, filters: List<(Int) -> Boolean>): List<Int> {
    var result = list
    for (filter in filters) {
        result = result.filter(filter)
    }

    return result
}

so you can rewrite your function as:

fun main() {
    val sol = filter((10..1000).toList(), listOf(::lastDigitIsLength, ::no7andNo1, ::isEvenAndGreater1))
    println("The number is $sol")
}

Upvotes: 1

Alexey Soshin
Alexey Soshin

Reputation: 17721

There are few ways to do that.
I've listed them in my example, along with some general comments.

// No need for varargs since Kotlin 1.3
fun main() {
    // Prefer vals over vars
    val sol = (10..1000).
            asSequence().// Use asSequence instead of toList
            filter { lastDigitIsLength(it) }. // Block
            filter(::no7andNo1). // Method reference
            toList()
    println("The number is $sol")

}

// Don't know what it means, so lets just always return true
fun lastDigitIsLength(i: Int) = true // Short notation

fun no7andNo1(i: Int): Boolean {
    return i % 10 == 7 || i % 10 == 1
}

Upvotes: 1

Related Questions