2016-02-26 13 views
12

Proste zmniejszenie pustej tablicy spowoduje:Jak wywołać metodę redukcji w pustej tablicy Kotlin?

Wyjątek w wątku "główny" java.lang.UnsupportedOperationException: Pusta iterable nie może być zmniejszona.

Ten sam wyjątek podczas łączenia:

val a = intArrayOf() 

val b = a.reduce({ memo, next -> memo + next }) // -> throws an exception 

val a1 = intArrayOf(1, 2, 3) 

val b1 = a.filter({ a -> a < 0 }).reduce({ a, b -> a + b }) // -> throws an exception 

Czy spodziewane działanie redukować czy jest to bug?

Czy są jakieś obejścia?

+1

FYI: Jeśli tylko przy użyciu 'reduce' do sumowania, wówczas można użyć wbudowanego' .sum() 'na listach numerów i jeśli zsumowanie rzeczy to jest trochę wyjątkowe, możesz napisać funkcję rozszerzenia, aby pomóc również. –

Odpowiedz

28

Wyjątek jest poprawny, reduce nie działa w pustej iteracji lub tablicy. To, czego prawdopodobnie szukasz, to fold, która przyjmuje wartość początkową i operację, która jest stosowana kolejno dla każdego elementu iteracji. reduce przyjmuje jako element początkowy element najpierw, więc nie wymaga podania dodatkowej wartości jako argumentu, ale wymaga, aby kolekcja nie była pusta.

Przykład użycia fold:

println(intArrayOf().fold(0) { a, b -> a + b }) // prints "0" 
+0

Dziękuję, krotnie wydaje się rozwiązaniem :) Tak więc, jak rozumiem, połączony filtrowanie i zmniejszenie jest ryzykowne, ponieważ filtr może oddać pustą listę i zmniejszenie będzie zawsze wywoływane, więc wyjątek zostanie zgłoszony. – dippe

+1

Dlaczego nie zdefiniujesz 'reduce' podobnie jak to jest zdefiniowane w ECMAScript 6? Niech 'zmniejszyć' bierze dwa parametry, funkcję i wartość początkową. Jeśli nie zdefiniowano żadnej wartości początkowej (inaczej "null"), 'reduce' przyjmuje pierwszą wartość w tablicy jako wartość początkową. – Stacky

Powiązane problemy