当前位置: 首页 > news >正文

函数式 Java 到函数式 Kotlin 的转换

  • 原文地址:From functional Java to functioning Kotlin
  • 原文作者:Benjamin Baxter
  • 译文出自:掘金翻译计划
  • 本文永久链接:github.com/xitu/gold-m…
  • 译者:huanglizhuo
  • 校对者:atuooo,hanliuxin5

将 @FunctionalInterface 转换到 Kotlin 中

Java 8 中引入了新的注解 @FunctionalInterface。目的是为创建一个带有非默认方法的接口,这样这个接口就可以将函数模拟成面向对象语言中的一等公民。比如,Comparable 就是只带有一个 compareTo 方法的 @FunctionalInterface

回调在函数式接口中很常见。想象一下下面的场景,我们想要进行一些异步操作,稍后将结果返回给调用的客户端。在 Java 中,我们可以创建一个下面这样的类:

public class MyAwesomeAsyncService {
   
    @FunctionalInterface
    public interface AwesomeCallback {
        void onResult(Result result);
    }
    private final AwesomeCallback callback;
   
    public MyAwesomeAsyncService(AwesomeCallback callback) {
        this.callback = callback;
    }
    public void doWork() {
        ...
        callback.onResult(result);
    }
}
复制代码

我们使用了有一个方法的回调接口,调用者只需实现它即可。

然而 Android Studio 附带的 Kotlin 转换器对 @FunctionalInterface 注解的转换并不是最优的。

class MyAwesomeAsyncService(private val callback: AwesomeCallback) {
   
    @FunctionalInterface
    interface AwesomeCallback {
        fun onResult(result: Result)
    }
    fun doWork() {
        ...
        callback.onResult(result)
    }
}
复制代码

转换结果是创建了一个一对一个转换接口,但这可以进一步优化吗? 在 Kotlin 中有个 SAM(Single Abstract Method)单个抽象方法概念。这正是 Java 8 中 @FunctionalInterface 的注解,但在文档中却没有创建 SAM 的例子,只讲了如何使用 SAM。

在构造函数中把接口转换为函数后,@FunctionalInterface 部分的样板代码从 96 个字符减少到 38 个字符,这可是减少了 40%。

class MyAwesomeAsyncService(private val onResult: (Result) -> Unit) {
    
    fun doWork() {
        ...
        onResult(result)
    }
}
复制代码

前后对比过后,你就会体会到 Kotlin 中这些语法糖是多么的好用。

上面的图片是 Java 转换为 Kotlin 的对比。

如果你也在使用 Kotlin 改造或者编写项目,欢迎在我的 Twitter 下面评论交流你使用 Kotlin 中踩坑填坑经历。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。

相关文章:

  • 23.2. 基础操作
  • Kubernetes系统架构简介[转]
  • Jenkins+Jmeter持续集成笔记(三:集成到Jenkins)
  • [译]使用 Siesta 处理 Swift 网络请求
  • 33.3. nanomsg
  • Salesforce收购数据库创业公司Attic Labs
  • 数组 类型 在 存储过程中 使用
  • 基于TableStore/MaxCompute的数据采集分析系统介绍
  • think php框架接入微信支付中需要注意的问题(php 小白适用)
  • 第一章
  • 分布式文件系统FastDFS如何做到高可用
  • Vmware Workstation及Centos6.8 的安装
  • Android系统shell中的clear命令实现【转】
  • 剑指offer15
  • iOS开发_记录调用系统应用
  • [nginx文档翻译系列] 控制nginx
  • Computed property XXX was assigned to but it has no setter
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • emacs初体验
  • JAVA多线程机制解析-volatilesynchronized
  • leetcode386. Lexicographical Numbers
  • Protobuf3语言指南
  • 番外篇1:在Windows环境下安装JDK
  • 基于webpack 的 vue 多页架构
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 物联网链路协议
  • puppet连载22:define用法
  • 函数计算新功能-----支持C#函数
  • ​Linux·i2c驱动架构​
  • ​用户画像从0到100的构建思路
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (四)模仿学习-完成后台管理页面查询
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转) Android中ViewStub组件使用
  • (转)3D模板阴影原理
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .net Application的目录
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core 版本不支持的问题
  • .NET Reactor简单使用教程
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET分布式缓存Memcached从入门到实战
  • .NET企业级应用架构设计系列之应用服务器
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • []指针
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [BZOJ3757] 苹果树
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体