2016-09-30 5 views
5

ben filtre uygulamak istediğiniz bir liste var, o zaman miktarlarının toplamı ile id bir harita döndürmek liste halinde BigDecimal toplamı:Kotlin:

val totalById = list 
        .filter { it.status == StatusEnum.Active } 
        .groupBy { it.item.id } 
        .mapValues { it.value.sumBy { it.amount } } 

"it.amount" BigDecimal, ancak benziyor sumBy sadece Int'dir.

java 8 için bu olurdu: KOTLIN bunu yapmanın bir yolu

Collectors.groupingBy(i-> i.getItem().getId(), Collectors.mapping(Item::getAmount, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))))

var mı?

cevap

7

Eğer java Collectors.reducing kullandım gibi, sen KOTLIN içinde fold veya reduce uzatma işlevleri kullanabilirsiniz:

val bigDecimals: List<BigDecimal> = ... 
val sum = bigDecimals.fold(BigDecimal.ZERO) { acc, e -> acc + e } 
// or 
val sum2 = bigDecimals.fold(BigDecimal.ZERO, BigDecimal::add) 
+1

Denedim: .mapValues ​​{it.value.map {it.amount} .fold (BigDecimal.ZERO, BigDecimal :: ekleyin) ama şikayet complierr "add ::": Aşağıdaki fonksiyonların Yok olabilir Sağlanan argümanlar ile çağrıldı: – klc

+0

[ERROR] özel açık eğlence ekleme (p0: BigInteger !, p1: Int, p2: BigInteger !, p3: Int): BigDecimal! java.math.BigDecimal [ERROR] özel açık eğlence ekleme (p0: Uzun, p1: Int, p2: BigInteger !, p3: Int): BigDecimal! java.math.BigDecimal [ERROR] özel açık eğlence ekleme (p0: Uzun, p1: Int, p2: Uzun, p3: Int): BigDecimal! java.math.BigDecimal [ERROR] özel açık eğlence ekleme (p0: Uzun, p1: Uzun): java.math içinde uzun tanımlı.BigDecimal [HATA] özel açık eğlence ekleme (p0: Uzun, p1: Uzun, p2: Int): BigDecimal! java.math.BigDecimal – klc

+0

klc tanımlanan, tam bir örnek hazırlanmış ve çalışır: http://try.kotlinlang.org/#/UserProjects/cpohvnjtfr0uvpvcjc3gt02b1t/n0j3v72oh55hdf141663os6eek, orada kendiniz deneyebilirsiniz. – Ilya

3

sumByDouble numarasına benzer kendi sumByBigDecimalextension function kodunuzu oluşturabilirsiniz. örneğin:

/** 
* Returns the sum of all values produced by [selector] function applied to each element in 
* the collection. 
*/ 
inline fun <T> Iterable<T>.sumByBigDecimal(selector: (T) -> BigDecimal): BigDecimal { 
    var sum: BigDecimal = BigDecimal.ZERO 
    for (element in this) { 
     sum += selector(element) 
    } 
    return sum 
} 

Örnek kullanım:

val totalById = list 
     .filter { it.status == StatusEnum.Active } 
     .groupBy { it.item.id } 
     .mapValues { it.value.sumByBigDecimal { it.amount } } 
+0

bir yolu var mı satır içi işlevi global hale getirmek için? Bu sumByBigDecimal görebildiğiniz gibi tüm uygulama genelinde kullanılır. – klc

+1

işlevi varsayılan olarak genel olarak Klc'dir. Her yere alınabilir ve kullanılabilir. –