Kotlin - referencje do funkcji

Odpowiedz Nowy wątek
2018-04-10 19:09
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


Nie pomagam przez PM. Pytania zadaje się na forum.

Pozostało 580 znaków

2018-04-10 19:20
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.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 10x, ostatnio: jarekr000000, 2018-04-10 19:41
I już wiem :-) - jarekr000000 2018-04-10 19:34
employees.filter(::aboveLimit) ? - Mikepq 2018-04-10 19:35

Pozostało 580 znaków

2018-04-10 19:36
0

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


Nie pomagam przez PM. Pytania zadaje się na forum.
zobacz wyżej - to nie kotlin/intellij. Btw. te o jedne wąsy za daleko czasem się zdarzają, ale normalnie jakoś dość szybko je łapie jeszcze w czasie pisania (jak mi Intellij buczy). Nie skojarzyłem nawet błędu kompilatora. - jarekr000000 2018-04-10 19:38

Pozostało 580 znaków

2018-04-10 19:44
0

Dobra, dzięki @Jarek:

    employees.filter(::aboveLimit)

Teraz działa :)


Nie pomagam przez PM. Pytania zadaje się na forum.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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