2016-02-26 41 views
12

Boş bir dizideki basit küçültme:Boş bir Kotlin dizisinde nasıl arama yapılır?

"main" iş parçacığındaki özel durum java.lang.UnsupportedOperationException: Boş yinelenen yinelenemez.

aynı istisna zincirleme zaman: o azaltmak beklenen operasyon

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 

mi yoksa bir hata mı?

Herhangi bir geçici çözüm var mı?

+1

: Sadece toplamı için 'reduce' kullanıyorsanız, o zaman numaraların listelerinin yerleşik' .sum() 'kullanabilir ve malzeme toplayarak eğer Bu biraz özel, sonra da yardımcı olmak için bir uzatma fonksiyonu yazabilirsiniz. –

cevap

28

İstisna doğru, reduce boş bir yinelenebilir veya dizi üzerinde çalışmaz. Muhtemelen aradığınız şey fold olup, başlangıç ​​değeri ve yinelenen her eleman için ardışık olarak uygulanan bir işlemdir. reduce, öğesinin ilk öğesini başlangıç ​​değeri olarak alır, bu nedenle bağımsız değişken olarak geçirilecek hiçbir ek değere gerek yoktur, ancak koleksiyonun boş olmaması gerekir. fold ait

Örnek kullanım: Bilginize

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

Teşekkür ederim, katlama çözüm gibi görünüyor :) Zincirli filtrelemeyi ve azaltmayı anlayabildiğimden dolayı, filtre boş bir liste verebileceğinden ve her zaman istisna olacağı için azaltma olacağı için risklidir. – dippe

+1

Neden "azaltmak", ECMAScript 6'da tanımlandığı gibi neden tanımlamıyorsunuz? 'Küçült' işlevini ve bir başlangıç ​​değerini iki parametre al. Eğer başlangıç ​​değeri tanımlanmamışsa (“null”), 'küçült 'dizideki ilk değeri başlangıç ​​değeri olarak kabul eder. – Stacky