2017-01-15 26 views
6

Weźmy następujący jedną wkładkę, która może być wyrażona jako serii operacji na zbiorze lub sekwencji:Jak debugować Kotlin sekwencje/Kolekcje

val nums = (10 downTo 1) 
     // .asSequence() if we want this to be a sequence 
     .filter { it % 2 == 0 } 
     .map { it * it } 
     .sorted() 
     // .asList() if declaring it a sequence 

println(nums) // [4, 16, 36, 64, 100] 

powiedzmy chcę zobaczyć elementy na siebie krok, byliby (z odliczeniem):

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 
[10, 8, 6, 4, 2] 
[100, 64, 36, 16, 4] 
[4, 16, 36, 64, 100] 

Niestety, nie ma dobry sposób na obu debugowania to z debuggera lub zalogować te wartości do późniejszego wglądu. Dzięki dobrym funkcjom programistycznym, całe metody mogą być przepisywane jako pojedyncze instrukcje, ale wydaje się, że nie ma dobrego sposobu sprawdzania stanów pośrednich, nawet liczb (tutaj: 10, 5, 5, 5).

Jaki jest najlepszy sposób na ich debugowanie?

+2

To nie są sekwencje, ale zwykłe kolekcje. Napraw tytuł, aby nikogo nie mylić. – voddan

+1

Należy rozróżnić kolekcję i sekwencję. Sekwencja leniwie oblicza listę, więc nie ma [100, 64, 36, 16, 4] w dowolnym momencie podczas wykonywania – D3xter

Odpowiedz

8

Możesz zalogować wartości pośrednie (list) z

fun <T> T.log(): T { println(this); this } 

//USAGE: 
val nums = (10 downTo 1) 
    .filter { it % 2 == 0 }.log() 
    .map { it * it }.log() 
    .sorted().log() 

To będzie działać zgodnie z oczekiwaniami, ponieważ w swoim przykładzie pracy z kolekcji, a nie sekwencji. Dla leniwych Sequence potrzebujesz:

// coming in 1.1 
public fun <T> Sequence<T>.onEach(action: (T) -> Unit): Sequence<T> { 
    return map { 
     action(it) 
     it 
    } 
} 

fun <T> Sequence<T>.log() = onEach {print(it)} 

//USAGE: 
val nums = (10 downTo 1).asSequance() 
    .filter { it % 2 == 0 } 
    .map { it * it }.log() 
    .sorted() 
    .toList() 
+0

Dziękujemy za fragment kodu! Niestety, muszę być proaktywny, aby dodać rejestrowanie (również sprawia, że ​​mój kod jest mniej czytelny). Wydaje się, że cała ta świetna zwięzłość kodu i brak błędów wydaje się przy tym kosztować. – Will

+0

To jest tylko technika debugowania. Nie polecałbym go używać do logowania wszelkiego rodzaju. – voddan

7

W najnowszym Intellij Idea podczas dodawania punktu przerwania masz opcję ustawienia go tak, aby nie sprawdzał całego wyrażenia, ale tylko ciało Lambda.

enter image description here

Następnie w samej debugowania można zobaczyć, co się dzieje wewnątrz Twojego Lambda.

enter image description here

Ale nie jest to jedyny sposób. Możesz również użyć Run to cursor (Alt + F9).

+0

Jak to jednak pomaga w zobaczeniu kolekcji pośrednich? –