Tag: lambda

为什么变量不能像在java中那样在内联函数中正确初始化?

我们知道lambda体是懒惰的 ,因为如果我们不调用lambda,lambda体中的代码永远不会被调用。 我们也知道在任何函数语言中,一个变量可以在函数/ lambda中使用,即使它没有被初始化,比如javascript,ruby,groovy和.etc,例如下面的groovy代码可以正常工作: def foo def lambda = { foo } foo = "bar" println(lambda()) // ^— return "bar" 我们也知道,如果在Java中的try-block中引发异常时catch块已经初始化变量,我们可以访问一个未初始化的变量,例如: // v— m is not initialized yet int m; try{ throw new RuntimeException(); } catch(Exception ex){ m = 2;} System.out.println(m);// println 2 如果lambda是懒惰的,为什么Kotlin不能在lambda中使用未初始化的变量? 我知道Kotlin是一个空安全的语言,所以编译器会从上到下分析代码,包括lambda体,以确保变量被初始化。 所以lambda体在编译时不是“懒惰”的。 例如: var a:Int val lambda = { a }// […]

kotlin android – 用Builder模式和Java 8 lambda定制对话框

我有一个自定义对话框类定义跟随生成器模式。 我的代码没有问题。 但是现在我想重建能够在java 8 lambda上使用 CustomDialogList.kt class CustomDialogList(context: Context, private var title: Int?, private var icon: Int?, private var map: Map<String, Any>, private var listner: OnItemClickListener) : Dialog(context) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.custom_dialog_list) txtTitle.text = context.getString(title!!) txtTitle.setCompoundDrawablesWithIntrinsicBounds(icon!!, 0, 0, 0) val listString: MutableList<String> = mutableListOf() val listObject: MutableList<Any> = mutableListOf() for ((k, […]

如何使用Lamba表达式使Java方法调用在Kotlin中不那么冗长?

下面的函数可以用Lambda表达式来减少冗余吗? 我如何修剪它? 它调用FilenameFilter.accept() Java方法。 val files = File(SECTIONS_DIR).listFiles(object : FilenameFilter { override fun accept(dir: File?, filename: String): Boolean { if (filename.matches(regex)) return true else return false } })

我如何声明一个函数参数来接受抛出的函数?

我在Kotlin中定义了一个函数: fun convertExceptionToEmpty(requestFunc: () -> List<Widget>): Stream<Widget> { try { return requestFunc().stream() } catch (th: Throwable) { // Log the exception… return Stream.empty() } } 我已经用这个签名定义了一个Java方法: List<Widget> getStaticWidgets() throws IOException; 我试图把它们写成这样: Stream<Widget> widgets = convertExceptionToEmpty(() -> getStaticWidgets()) 当我编译我得到这个错误: 错误:(ln,col)java:unreported exception java.io.IOException; 必须被逮捕或宣布被抛出 我如何定义我的函数参数来接受抛出的函数?

抽象类与Lambda参数

由于kotlin对lambdas有很好的支持,我开始使用lambdas作为abstract类的构造函数参数,而不是声明abstract val/fun 。 我认为这更简洁,特别是因为val type get的推断。 这有什么缺点? abstract class AbstractListScreen<T> ( val data: Set<T>, val filterators: (T) -> Set<String> ) { fun open() { /* … */ } } class OrderListScreen : AbstractListScreen<Data>(data = setOf(), filterators = { setOf(it.toString()) } ) { fun someEvent() { /* …*/ } }

带有Scala接收器的函数类型

我正在调查这个Kotlin的例子: class HTML { fun body() { … } } fun html(init: HTML.() -> Unit): HTML { val html = HTML() // create the receiver object html.init() // pass the receiver object to the lambda return html } html { // lambda with receiver begins here body() // calling a method on the receiver object […]

传递lambda的映射时,得到了NoClassDefFoundError

我使用Kotlin创建了一个Android应用程序,lambda有一些奇怪的东西。 我传递mapOf(1 to {…}, 2 to {…})并得到NoClassDefFoundError或ClassNotFoundException 。 我尝试在桌面上重写它,并获得相同的,但具有不同的堆栈跟踪。 fun main(args: Array<String>) { call(mapOf( 1 to { "asd" }, 2 to { 999 } )) } fun call(x: Map<Int, () -> Any>) { } 这是堆栈跟踪: Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at TestKt.main(test.kt) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:61) at […]

为什么kotlin lambda反编译为java代码是(Function0)null.INSTANCE

当我在一个类中声明一个属性如下: class xx{ var b:()->Boolean={false} } 然后反编译如下: …… public xxx() { this.b = (Function0)null.INSTANCE; } …… (Function0)null.INSTANCE代表什么? 我认为这将是 : this.b= new Function0() { public final Object invoke() { return false; } }; 但它不,为什么? 谢谢!

如何在kotlin中编写含泛型的lambdas?

我可以使用显式类型编写lambdas id_Int和id_Boolean 。 我可以用类型参数编写函数identity 。 我可以用类型参数写lambda吗? fun testFuncInt(f: (Int) -> Int): Int = f(1) + 2 val id_Int = { x: Int -> x } fun testFuncBoolean(f: (Boolean) -> Boolean): Boolean = !f(false) val id_Boolean = { x: Boolean -> x } fun <T> identity(x: T) = x fun main(args: Array<String>) { println(testFuncInt(id_Int)) println(testFuncInt(::identity)) println(testFuncBoolean(id_Boolean)) […]

Android Kotlin不能在lambda中使用list.sort()

有一个字符串列表,用于过滤直接使用lambda表达式 val list= ArrayList<String>() list.add("eee") list.add("888") list.add("ccc") list.filter({it.length > 0}) // this passing function works too list.filter(fun(it) = it.length > 0) 它被定义为采用lambda函数类型: (T) -> Boolean public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { return filterTo(ArrayList<T>(), predicate) } 但类似的语法不适用于sort() 。 它要求使用sortWith来代替。 不明白为什么不能直接在filter()调用中传递lambda表达式。 有人可以解释为什么sort()不能直接使用lambda函数的类似语法? list.sort({ first: String, second: String -> first.compareTo(second) }) list.sort定义如下,同样采用lambda函数: (T, T) […]