读取assets中的文本内容

resources.assets.open("test.txt").let {it.buffered().reader().use { reader ->Log.e("test", "${reader.readText()}")}
}

统计字符出现的次数(“io.reactivex:rxjava:1.2.1”)

/*** filter中过滤掉空字符* groupBy 分组* o.count 进行统计,得到的是一个observable*/
//    Observable.from(txt.toCharArray().asIterable()).filter { !it.isWhitespace() }.groupBy { it }.map(::println)
Observable.from(txt.toCharArray().asIterable()).filter { !it.isWhitespace() }.groupBy { it }.map { o ->o.count().subscribe {println("key = ${o.key} , count = $it")}
}.subscribe()

retrofit发送get请求

interface GithubService {@GET("/repos/enbandari/Kotlin-Tutorials/stargazers")fun getUserInfos(): Call<List<User>>
}// object单例类
object ServiceManager {val apiService: GithubService by lazy {Retrofit.Builder().baseUrl("https://api.github.com").addConverterFactory(GsonConverterFactory.create()).build().create(GithubService::class.java)}
}data class User(val login: String, val id: Long, val avatar_url: String)

单例类的5种实现方式对比

java

第一种方式

public class LazyNotThreadSafe {private static LazyNotThreadSafe INSTANCE;private LazyNotThreadSafe() {}public static LazyNotThreadSafe getInstance() {if (INSTANCE == null) {INSTANCE = new LazyNotThreadSafe();}return INSTANCE;}
}

第二种方式

public class LazyThreadSafeDoubleCheck {private static LazyThreadSafeDoubleCheck INSTANCE;private LazyThreadSafeDoubleCheck() {}public static LazyThreadSafeDoubleCheck getInstance() {if (INSTANCE == null) {synchronized (LazyThreadSafeDoubleCheck.class) {if (INSTANCE == null) {//初始化时分为实例化和赋值两步, 尽管我们把这一步写成下面的语句,// 但Java虚拟机并不保证其他线程『眼中』这两步的顺序究竟是怎么样的INSTANCE = new LazyThreadSafeDoubleCheck();}}}return INSTANCE;}
}

第三种方式

public class LazyThreadSafeStaticInnerClass {private static class Holder {private static LazyThreadSafeStaticInnerClass INSTANCE = new LazyThreadSafeStaticInnerClass();}private LazyThreadSafeStaticInnerClass() {}public static LazyThreadSafeStaticInnerClass getInstance() {return Holder.INSTANCE;}
}

第四种方式

public class LazyThreadSafeSynchronized {private static LazyThreadSafeSynchronized INSTANCE;private LazyThreadSafeSynchronized() {}public static synchronized LazyThreadSafeSynchronized getInstance() {if (INSTANCE == null) {INSTANCE = new LazyThreadSafeSynchronized();}return INSTANCE;}
}

第五种方式

public class PlainOldSingleton {private static PlainOldSingleton INSTANCE = new PlainOldSingleton();private PlainOldSingleton() {}public static PlainOldSingleton getInstance() {return INSTANCE;}
}

kotlin

第一种方式

class LazyNotThreadSafe private constructor(){companion object {val instance by lazy {LazyNotThreadSafe()}// 下面是另一种等价的写法, 获取单例使用 get 方法private var instance2: LazyNotThreadSafe? = nullfun get(): LazyNotThreadSafe {if (instance2 == null)instance2 = LazyNotThreadSafe()return instance2!!}}
}

第二种方式

class LazyThreadSafeDoubleCheck private constructor() {companion object {val instance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {LazyThreadSafeDoubleCheck()}private @Volatilevar instance2: LazyThreadSafeDoubleCheck? = nullfun get(): LazyThreadSafeDoubleCheck {if (instance2 == null) {synchronized(this) {if (instance2 == null) {instance2 = LazyThreadSafeDoubleCheck()}}}return instance2!!}}
}

第三种方式

class LazyThreadSafeStaticInnerClass private constructor() {companion object {fun getInstance() = Holder.instance}private object Holder {val instance= LazyThreadSafeStaticInnerClass()}
}

第四种方式

class LazyThreadSafeSynchronized private constructor() {companion object {private var instance: LazyThreadSafeSynchronized? = null@Synchronizedfun get(): LazyThreadSafeSynchronized {if (instance == null)instance = LazyThreadSafeSynchronized()return instance!!}}
}

第五种方式

/*** 定义的类本身就是单例类*/
object PlainOldSingleton

动态代理之解决reified不足的问题

{"code": 0,"message": "ok","content": {"id": 1,"name": "Unknown","songs": [{"id": 0,"name": "Rada"},{"id": 1,"name": "Olympic Dream"},{"id": 2,"name": "The Escapist"}]}
}

Gson的扩展方法

// 通常情况下使用inline+reified解决泛型不被擦
inline fun <reified T : Any> Gson.fromJson(json: String): T {return fromJson(json, T::class.java)
}

通过动态代理获取到Singer类型

interface Api {fun getSingerFromJson(json: String): BaseResult<Singer>
}object ApiFactory {val api: Api by lazy {Proxy.newProxyInstance(ApiFactory.javaClass.classLoader,arrayOf(Api::class.java)) { proxy, method, args ->// 获取方法的返回值类型val responseType = method.genericReturnTypeval adapter = Gson().getAdapter(TypeToken.get(responseType))adapter.fromJson(args[0].toString())} as Api}
}

代码示例:

val text = File("result_singer.json").readText()
val result: BaseResult<Singer> = gson.fromJson(text)

BaseResult(code=0, message=ok, content={id=1.0, name=Unknown, songs=[{id=0.0, name=Rada}, {id=1.0, name=Olympic Dream}, {id=2.0, name=The Escapist}]})

代码示例

val result2: BaseResult<Singer> = ApiFactory.api.getSingerFromJson(text)
println(result2)

BaseResult(code=0, message=ok, content=Singer(id=1, name=Unknown, songs=[Song(id=0, name=Rada), Song(id=1, name=Olympic Dream), Song(id=2, name=The Escapist)]))

使用高阶函数替换java中的回调接口

java代码

public class TaskExecutor {private OnCompletionListener onCompletionListener;public interface OnCompletionListener {void onDone(long time);}public void setListener(OnCompletionListener listener) {this.onCompletionListener = listener;}public void execute() {Executors.newSingleThreadExecutor().execute(() -> {for (int i = 0; i < 5; i++) {System.out.println("time num " + i);}try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if (onCompletionListener != null) {onCompletionListener.onDone(new Date().getTime());}});}
}

调用

val taskExecutor = TaskExecutor()
taskExecutor.setListener {object : TaskExecutor.OnCompletionListener {override fun onDone(time: Long) {println("time = $time")}}
}
//    taskExecutor.execute()
println()taskExecutor.setListener {TaskExecutor.OnCompletionListener { time -> println("time = $time") }
}
//    taskExecutor.execute()
//    println()

kotlin代码

class KTTaskExecutor {// 定义lambda表达式private var listener: (Long) -> Unit = {}// 设置接口fun setListener(e: (Long) -> Unit) {this.listener = e}fun exec(e: (Long) -> Unit) {this.listener = eExecutors.newSingleThreadExecutor().execute {for (i in 1..5) {println("index at $i")}Thread.sleep(500)e(Date().time) // 调用函数并传入数据}}
}

未改造前

class Request(val url: String) {public fun run(callback: Callback) {async {val readText = URL(url).readText()println("${javaClass.simpleName} , $readText")uiThread {println("${javaClass.simpleName} , $readText")callback.done(readText)}}}public interface Callback {fun done(data: String)}
}

改造后

class AdvRequest(val url: String) {// 匿名接口,需要传入一个数据var listener: (String) -> Unit = {}private setfun run(e: (String) -> Unit) {async {val readText = URL(url).readText()println("${javaClass.simpleName} , $readText")uiThread {println("${javaClass.simpleName} , $readText")e(readText)}}}
}

调用

KTTaskExecutor().exec { time ->println("kttime = $time")
}btn_exec_net_req.onClick {rl_loading2.visibility = View.VISIBLERequest(AppConst.API_REQ_STARTS).run(object : Request.Callback {override fun done(data: String) {tv_result.text = datarl_loading2.visibility = View.GONE}})
}btn_exec_net_req2.onClick {rl_loading2.visibility = View.VISIBLEAdvRequest(AppConst.API_REQ_STARTS).run { e ->tv_result.text = erl_loading2.visibility = View.GONE}
}

kotlin之开发经验整理相关推荐

  1. Android Gallery2 开发经验整理

    首先一点,通过Gallery2的源码分析来看,他并不是一个普通的app应用,所有界面并不是普通的View.而是通过openGL来做的!所以,一定不要用普通的View的想法来分析Gallery2的源码! ...

  2. Uniapp 多端开发经验整理

    开发准备 小程序 后台配置 小程序个别类目需要行业资质,需要一定时间来申请,根据项目自身情况尽早进行 服务类目 的设置以免影响上线时间. 必须在后台进行 服务器域名配置,域名必须 为 https .否 ...

  3. VR乒乓球项目Unity3D 开发经验整理,2代码

    上一篇搭了游戏场景,完全没提代码.因为图形化的部分足够模拟一个世界. 下面是编码,其实控制部分的代码少的可怜,重点全在AI上,计分系统量也不少,但我认为那是细枝末节. private void Fix ...

  4. 学习 Kotlin 的 20 个实用资源

    Кotlin 是在 Java VM 上运行的现代编程语言,它的语法优雅,可与现有的 Java 库互操作. 在 2017 年 Google I/O 中,Android 团队宣布将 Kotlin 作为 A ...

  5. 都掌握了吗?Kotlin技能小成

    前些文章描述了 Kotlin教程,包括一些基本语法. 很多时候,还需要加以练习. 本文将开发过程中,遇到的点,整理成线,继而到面 希望 把下面的问题掌握之后,掌握Kotlin在Android中的开发能 ...

  6. 培训机构的程序员,出来工作就18k,真的能适应吗?

    这是我一个表弟从Java培训机构出来在工作上的真实情况 他是高中毕业然后去了培训机构.后端培训出来.公司的边缘人物.性格内向,平常都是一个人吃饭,平时也很少跟同事唠嗑,碰见同事也没有打招呼.但工作上的 ...

  7. 汇编工具DOSBOX安装使用

    ----------------------------------- 版权信息 ------------------------------------ 此文链接: http://blog.csdn ...

  8. Code Review的亲身实践

    Code Review,中文叫代码审查,指的是完成了部分功能的代码开发之后,在代码真正合并到仓库主分支之前,邀请同事帮你进行代码的审核和检查,检查代码的质量.规范.设计等等方面的过程. 代码审查的好处 ...

  9. 写给中高级前端关于性能优化的9大策略和6大指标 | 网易四年实践

    「链接和长图失效,请大家点击阅读原文查看详情」 前言 笔者近半年一直在参与项目重构,在重构过程中大量应用「性能优化」和「设计模式」两方面的知识.「性能优化」和「设计模式」两方面的知识不管在工作还是面试 ...

  10. 有线电视新闻有一段屏蔽时间,性别不平衡

    使用AI追踪十年有线电视新闻中的性别代表 (Tracking gender representation across a decade of cable news using AI) As Amer ...

最新文章

  1. 开源android豆瓣电影阅读器
  2. 存在于实数域的微观粒子7-神经网络与电磁场
  3. ML:MLOps系列讲解之系列知识解读全貌
  4. PL0编译器TurboPascal版再现时间:2009-07-20 17:24:49来源:网络 作者:未知 点击:52次
  5. Navicat Premium 12连接SQLServer[ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序
  6. CVSNT Manual
  7. 深度揭秘安全领域的那些“大牛” 竟过半在360
  8. python迅雷远程下载页面_迅雷远程下载 linux
  9. 掌握茼蒿施肥方式,想不高产都难。
  10. 记录一下Python的11个小技巧
  11. 2023年西南交通大学马克思主义理论考研上岸前辈备考经验
  12. 【无代码体验】用鲸智搭替换Excel表管理数据
  13. 聊城大学计算机学院2016级11班,E·社会实践 | “观运河风采,忆聊城古韵”——2016级11班...
  14. 嵌入式arm板linux路由表设置
  15. 领英精灵安全吗?附LinkedIn领英开发客户的关键点
  16. JS作用域和自由变量
  17. 仿个人税务 app html5_假个税APP蹭热点窃信息防不胜防,你千万别下载错了!
  18. VolgaCTF2015之lcg的writeup
  19. js中唤醒弹框的3种方式
  20. STM32移植μC/OS-II操作系统

热门文章

  1. 数据库防火墙:数据库防火墙商业化的前提条件
  2. 数据安全--11--数据安全政策文件体系
  3. 华为3COM正式更名为『杭州华三通信技术有限公司(H3C)』
  4. 医疗图像论文笔记二:《Learning to recognize Abnormalities in Chest X-Rays with Location-Aware Dense Networks》
  5. python爬虫-批量下载qq音乐
  6. java 实现word文档的在线签批圈阅(手写批注)
  7. 分享 百度网盘,不用开会员也可以免费同步上传视频和照片的方法
  8. 太阳高度角计算题_【高考地理】地理计算题型汇总(附太阳高度角专题设计)...
  9. 壮族小伙车祸离世 父亲含泪捐儿器官救6人
  10. vsftpd 虚拟用户