Kotlin - referencje do funkcji

1

Witam
Zacząłem się uczyć Kotlina i jestem obecnie na wyrażeniach lambda. Jest sobie taka data class:


data class Employee constructor(val name: String, val salary: BigDecimal) {
    override fun toString(): String {
        return "Employee(name : $name, salary: $salary)"
    }
}

Teraz w pliku gdzie mam maina robie tak:


fun aboveLimit(employee: Employee) = employee.salary > BigDecimal(10000)

fun main(args : Array<String>) {

    val employees = listOf(Employee("Aleksander", BigDecimal(1000)),
             Employee("Jan", BigDecimal(12000)))
    employees.filter { ::aboveLimit}
}

I teraz mam takie pytanie - czemu wyskakuje mi wyskakuje :
"Type mismatch. Required (Employee) -> Boolean, Found : (Employee) -> KFunction1<@ParameterName Employee, Boolean>

Z tego co zrozumiałem z "Kotlin In Action" to chyba powinienem móc odwołać się do tej funkcji jako zadeklarowanej wyżej. Nie moge sie także do settera odwołać Jak pisze:

    val max = employees.maxBy { Employee::salary }

@jarekr000000 pomóż :D

0

NIe używam tego :: w kotlinie chyba nigdzie (nawet nie wiedziałem, że działa (albo nie). Tylko it.
employees.filter { aboveLimit(it)}

Poprawka : właśnie się okazało, że jednak :: używam w wielu miejscach... i działa ( mieszam w projekciejavę i kotlina... i myśłałem, że :: było tylko w javowej częsci).
Nie rozumiem czemu w tym przypadku nie. Ale na szybko sprawdziłem wersja z it jest ok.

Próbuje zrozumiec co tam się stało. IMO oryginalny kod jednak powinien działać.
I niezła miazga z tym kodem. Jeszcze na takie coś nie trafiłem:-)
Lekka przeróbka:

val  aboveLimit =  {employee: Employee -> (employee.salary > BigDecimal(10000)) }
[...]
employees.filter { aboveLimit}

I mam:
Error:(12, 35) Kotlin: Type mismatch: inferred type is (Employee) -> (Employee) -> Boolean but (Employee) -> Boolean was expected

Czego ja nie widze?

....
I już widze- podwójna funkcja.
Masz o jedne wąsy za dużo.
filter przyjmuje funkcje jako parametr. ::aboveLimit to bardzo dobra funkcja. A co robi klamra? Robi funkcję z tego co masz w środku { ::aboveLimit} - tu jest o jeden poziom funkcyjności za daleko.

0

Musze sprawdzić czy mam dobra wersje keczupu (referencje do funkcji się chyba później pojawily) :)

0

Dobra, dzięki @jarek:

    employees.filter(::aboveLimit)

Teraz działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1