簡體   English   中英

如何將 java.util.function.Predicate 實現為 Kotlin lambda?

[英]How to implement a java.util.function.Predicate as Kotlin lambda?

我需要將java.util.function.Predicate傳遞給 Java 函數。 如何在 Kotlin 中將其實現為 Lambda?

我需要調用的 Java 函數:

public void foo(Predicate<String> p)

Java Lambda 實現✔:

foo(text-> true)

Kotlin Lambda 實現❌:

foo{text:String -> true}  
    ^^^^^^^^^^^^ 
Type mismatch.
Required: Predicate<String>
Found:    (String) → Boolean

Kotlin 版本 1.2.21

從 Kotlin 1.4 開始

foo({text -> true  })

foo {text -> true}     

在 Kotlin 1.4 之前

這些變體有效:

foo(Predicate {text -> true  })  
foo(Predicate {true})
foo({true  }as Predicate<String>)

它工作正常,這是一個使用 Java List編譯的測試和將Predicate作為參數的filter方法:

val test = Arrays.asList("Hello", "Bye", "World!")
println(test)
println(test.filter { it.startsWith("W") })

最后一個示例代碼 ( foo{text:String -> true} ) 是您無法編譯的代碼嗎?

在大括號之間,您應該傳遞 lambda 的實現,而不是它的類型/接口。 這部分為你推斷!

從 Kotlin 1.4 開始,支持 Java 接口的單一抽象方法 (SAM) 轉換: https : //kotlinlang.org/docs/reference/java-interop.html#sam-conversions

從問題中的示例來看,以下內容現在有效:

foo { text -> true }

如果要聲明為屬性:

private val normal = Predicate<Int> { true }
private val even = Predicate<Int> { it % 2 == 0 }
private val odd = even.negate()

fun main() {
 println("Normal count ${get(normal)}")
 println("Even count ${get(even)}")
 println("Odd count ${get(odd)}")

}

fun get(predicate: Predicate<Int>): Int {
 val filter = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).filter { predicate.test(it)}  
 println(filter)
 val map = filter.map { it * 2 }
 println(map)
 return map.sum()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM