Kotlin 函数式接口

文章目录

  • 定义
  • 实例化
  • [Kotlin 调用 Java 单抽象方法接口](#Kotlin 调用 Java 单抽象方法接口)

定义

在 Kotlin 中,如果一个接口只有 一个抽象方法(其他抽象成员数量不限),可以写成类似函数的形式。

kt 复制代码
fun interface Editable {
    // 此处 abstract 可省略
    abstract fun edit()
}

实例化

正常情况下,我们实例化接口需要用到匿名对象object {}

kt 复制代码
fun main() {
    val editable = object : Editable {
        override fun edit() {
            print("编辑中...")
        }
    }
    editable.edit()
}
复制代码
编辑中...

而定义了函数式接口后,我们可以这样做:

kt 复制代码
fun main() {
    val editable = Editable { 
        print("编辑中...")
    }
}

Kotlin 调用 Java 单抽象方法接口

(不知道 Java 是什么可以跳过)

在 Java 中的Runnable接口中只定义了一个抽象方法run,这样的 Java 单抽象方法接口在 Kotlin 中是可以像调用函数式接口fun interface一样调用的(Kotlin 的接口则必须在定义时interface前加fun才行):

java 复制代码
// Runnable.java
@FunctionalInterface
public interface Runnable {
    /**
     * Runs this operation.
     */
    void run();
}

如果使用 Java 实例化该接口,需要这样写:

java 复制代码
public class Test {
    public static void main(String[] args) {
    	// 这是实例化的位置
        new Runnable() {
            @Override
            public void run() {
                System.out.print("Run");
            }
        };
    }
}

而使用 Kotlin 是这样写的:

kt 复制代码
fun main() {
	object : Runnable {
        override fun run() {
            print("Run")
        }
    }
}

使用函数式接口调用的写法后,它又是这样的:

kt 复制代码
fun main() {
    Runnable {
        print("Run")
    }
}

该学谁不用我说了吧。

相关推荐
Android-Flutter20 小时前
android compose LazyColumn 垂直列表滚动 使用
android·kotlin
儿歌八万首1 天前
Jetpack Compose 自定义布局解析
kotlin·compose·自定义布局
Kapaseker1 天前
初级与中级的Android面试题区别在哪里
android·kotlin
zFox1 天前
二、Kotlin高级特性以及Compose状态驱动UI
ui·kotlin·compose
PuddingSama2 天前
Gson 很好,但在Kotlin上有更合适的序列化工具「Kotlin Serialization」
android·kotlin·gson
郑梓斌2 天前
Luban 2:简洁高效的Android图片压缩库
微信·kotlin
我命由我123452 天前
Android Jetpack Compose - Compose 重组、AlertDialog、LazyColumn、Column 与 Row
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
愤怒的代码2 天前
在 Android 中执行 View.invalidate() 方法后经历了什么
android·java·kotlin
Android-Flutter2 天前
android compose PullToRefreshAndLoadMore 下拉刷新 + 上拉加载更多 使用
android·kotlin