文章目录

  • ViewGroup获取ChildView集合
  • inline noinline crossinline比较
  • Kotlin 简化 Parcelable
  • orEmpty()
  • kotlin 代理 关键字 by
  • TimingKt 获取执行时长
  • Kotlin List 操作符重载
  • repeat 重复执行
  • startForegroundService
  • vararg 关键字
ViewGroup获取ChildView集合
fun ViewGroup.asSequence(): Sequence<View> = (0..childCount).asSequence().map { getChildAt(it) }
inline noinline crossinline比较

参考:https://blog.csdn.net/u013009899/article/details/78584994
Kotlin代码

fun outterFun() {innerFun {return//支持直接返回outterFunreturn@innerFun 1 //如果要返回lambda,则必须有返回值}innerFun_ {//return//不支持直接返回outterFunreturn@innerFun_ 1 //如果要返回lambda,则必须有返回值}innerFun__ {//return//不支持直接返回outterFunreturn@innerFun__ 1 //如果要返回lambda,则必须有返回值}//以下lambada变换意义相同/总有一款你喜欢的foo(fun() {}, { "" })foo({}, { "" })foo(fun() = Unit, { "" })foo({}) { "" }//推荐//方式一 外部变量foo({ }, testNotInlined)//方式二 局部变量//如果是匿名或者具名函数,则支持var f = fun(): String? { return "MaQi" }foo({ }, f)foo({ }, innerFun___no())//方式三 函数传参innerFun___(fun(reult: String?) {//返回的Maqi将在该函数中被调用}, { "Maqi" })foo({ }, innerFun___({ reult -> }) { "Maqi" })//转换foo({}, innerFun___(fun(reult: String?) {//返回的Maqi将在该函数中被调用}, { "Maqi" }))//测试 crossinlineval retsult = innerFun___c(fun(reult: String?): String? {//返回的Maqi将在该函数中被调用return reult}, { "" })
}//没有inline,函数不能外部返回,即innerFun不能直接return
fun innerFun__(a: () -> Int) {}//让函数允许非局部返回(外部返回)
inline fun innerFun(a: () -> Int) {}//inline crossinline需要同时存在
inline fun innerFun_(crossinline a: () -> Int) {}//noinline 修饰 该函数只能作为参数传递,不能外部申明,inline noinline需要同时存在
inline fun foo(inlined: () -> Unit, noinline notInlined: () -> String?) {}//方式一
var testNotInlined = fun(): String? {return ""
}//方式二
fun innerFun___(): () -> String? {return testNotInlined
}//方式三
inline fun innerFun___(callback: (reult: String?) -> Unit, notInlined: () -> String?): () -> String? {val string = notInlined()callback(string)return { string }
}//可以发现 我们加上inlin后提示 noinline必须同时加上
//Can't inline 'notInlined' here: it may contain non-local returns. Add 'crossinline' modifier to parameter declaration 'notInlined'
//翻译以下大概意思是 函数当参数 有出现嵌套的情况下 我们必须让被套的那个不能提前return
//因为inline允许外部返回,即直接return,这样可能出现问题
inline fun innerFun___c(crossinline callback: (reult: String?) -> String?, crossinline notInlined: () -> String?): () -> String? {return { callback(notInlined()) }
}inline fun innerFun___no(): () -> String? {//Local functions are not yet supported in inline functions
//    return fun(): String? {//        return ""
//    }
//如果是匿名或者具名函数,则支持return {""}
}

结论

  1. inline 修饰fun ,使函数可非局部返回
  2. crossinline 和 noinline 限制非局部返回,都只能修饰函数参数
  3. crossinline 或noinline存在时,inline 必须存在
  4. noinline 修饰的函数参数 只能在内联函数内部调用或者作为可内联的参数传递
  5. 它们貌似只会在代码编辑的时候提示,反编译Java代码没有什么特别,都是另外申明一个静态类继承Lambda 和实现invoke函数

如下为:testNotInlined 代码反编译示例

import kotlin.Metadata;
import kotlin.jvm.functions.Function0;
import kotlin.jvm.internal.Lambda;
import org.jetbrains.annotations.Nullable;@Metadata(bv = {1, 0, 3}, d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u000e\n\u0000\u0010\u0000\u001a\u0004\u0018\u00010\u0001H\n¢\u0006\u0002\b\u0002"}, d2 = {"<no name provided>", "", "invoke"}, k = 3, mv = {1, 1, 13})
/* compiled from: Demo.kt */
final class DemoKt$testNotInlined$1 extends Lambda implements Function0<String> {public static final DemoKt$testNotInlined$1 INSTANCE = new DemoKt$testNotInlined$1();DemoKt$testNotInlined$1() {super(0);}@Nullablepublic final String invoke() {return "";}
}

非局部返回:直接在lambda返回外部函数

Kotlin 简化 Parcelable

在build gradle中申明

androidExtensions {experimental = true
}

@Parcelize 注解

@Parcelize
class Book(val title: String, val author: String, val year: Int) : Parcelable

参考Kotlin开发者:Parcelable, simplified
注意:文中指出存在兼容和继承的隐患,请谨慎使用

orEmpty()

String.kt 扩展函数

/** Returns the string if it is not `null`, or the empty string otherwise. */
@kotlin.internal.InlineOnly
public inline fun String?.orEmpty(): String = this ?: ""

当然还有很多很多骚操作,这里不一一列举。

kotlin 代理 关键字 by
@SuppressLint("ParcelCreator")
@Parcelize
data class TaskDetailArgs(val id: String) : Parcelableprivate val args: TaskDetailArgs by args()fun <V : Any> args() = object : ReadOnlyProperty<Fragment, V> {var value: V? = nulloverride fun getValue(thisRef: Fragment, property: KProperty<*>): V {if (value == null) {val args = thisRef.arguments ?: throw IllegalArgumentException("There are no fragment arguments!")val argUntyped = args.get(“KEY_ARG”)argUntyped ?: throw IllegalArgumentException("arguments not found at key KEY_ARG!")@Suppress("UNCHECKED_CAST")value = argUntyped as V}return value ?: throw IllegalArgumentException("")}
}

kotlin List find

data class User(val name: String)
val data: List<User> = emptyList()
data.find { it.name == "MqQi" }
//等价于
data.firstOrNull { it.name == "MqQi" }
TimingKt 获取执行时长
/*** Executes the given [block] and returns elapsed time in milliseconds.*/
public inline fun measureTimeMillis(block: () -> Unit): Long {val start = System.currentTimeMillis()block()return System.currentTimeMillis() - start
}

使用

 val time = measureTimeMillis {}
Kotlin List 操作符重载

Collection.kt 扩展函数

/*** Returns a list containing all elements of the original collection and then the given [element].*/
public operator fun <T> Collection<T>.plus(element: T): List<T> {val result = ArrayList<T>(size + 1)result.addAll(this)result.add(element)return result
}
 val list = listOf<String>() + "MQ"
repeat 重复执行
repeat(100) {Log.i("repeat", "repeat:$it")
}
startForegroundService
 @SuppressLint("NewApi")fun Service.setForegroundIfNecessary() {val exitIntent = Intent(this, ExitBroadcastReceiver::class.java).apply {action = "ACTION_TO_BACKGROUND"}val exitPendingIntent = PendingIntent.getBroadcast(this, 0, exitIntent, 0)val builder = NotificationCompat.Builder(this, "CHANNEL_NODE").setContentTitle(getString(R.string.app_name)).setContentText(getString(R.string.background_connection_enabled)).setPriority(NotificationCompat.PRIORITY_MIN).setWhen(0).setDefaults(0).setSound(null).setDefaults(0).setOnlyAlertOnce(true).setColor(ContextCompat.getColor(this, R.color.gray_light)).setSmallIcon(R.drawable.ic_msg_default).addAction(R.drawable.ic_close_black_24dp, getString(R.string.exit), exitPendingIntent)val pendingIntent = PendingIntent.getActivity(this, 0,MainActivity.getSingleIntent(this), 0)builder.setContentIntent(pendingIntent)supportsOreo {val channel = NotificationChannel("CHANNEL_NODE","Message_Node", NotificationManager.IMPORTANCE_LOW)channel.lockscreenVisibility = Notification.VISIBILITY_PUBLICchannel.setSound(null, null)channel.setShowBadge(false)notificationManager.createNotificationChannel(channel)}startForeground(66666, builder.build())}inline fun supportsOreo(code: () -> Unit) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {code()}}class ExitBroadcastReceiver : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent?) {}}companion object {fun startService(ctx: Context, action: String? = null) {val intent = Intent(ctx, MessageService::class.java).apply {this.action = action}ContextCompat.startForegroundService(ctx, intent)}fun stopService(ctx: Context) {val intent = Intent(ctx, MessageService::class.java)ctx.stopService(intent)}}companion object {fun getSingleIntent(context: Context): Intent {return Intent(context, MainActivity::class.java).apply {addCategory(Intent.CATEGORY_LAUNCHER)addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)}}}
vararg 关键字
fun addPlayer(game: Game, vararg players: Player):Deferred<List<PlayerStatus>>{players.forEach { player ->}
}

To be continue…

Kotlin骚气写法 三相关推荐

  1. Elementui删除表格最后一页全部数据后跳到前一页的骚气写法

    造成这个原因是由于currentPage没有更新的原因,当最后一页的数据删除后,请求的current没有改变. 不要慌我的这种写法想跳哪一页就跳哪一页 这是分页参数 这是表格数据 我们可以给个变量fl ...

  2. 三款很酷很骚气的底部导航

    早上好,骚年,我是小菜,我的公众号「菜鸟翻身」会推荐 GitHub 上好玩的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注我. 底部导航栏是 APP 最常用的功能之一,想最初都是自 ...

  3. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  4. js增加透明css样式,如何配置透明发光的骚气 vscode

    1 安装自定义 JS 和 CSS 插件 2 安装发光主题 3 添加样式配置文件 在 VSCode 安装目录(自己随便选择一个文件夹也可以),放入以下文件. 为了方便下载,文件整理到了 Github-J ...

  5. 火爆全网!这个 Python 项目很骚气!

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 来源:量子位 像文字云一样,用各种小图拼出大的图片,构建一个像素风的世界,就像< ...

  6. 这个项目很骚气,已开源!作者脑洞也够大!!

    来源:公众号量子位 像文字云一样,用各种小图拼出大的图片,构建一个像素风的世界,就像<我的世界>里一样,一定非常有趣. 还可以拿来做拼贴画.十字绣等装饰. 在这个名为tiler的GitHu ...

  7. 最骚气的APP更新文案盘点

    因为手机里 下了超多APP 每次打开AppStore都会很崩溃 这样的更新提示就问你怕不怕 要是一不小心按到「全部更新」 手机就彻底原!地!爆!炸! 所以我一般更新APP都会很谨慎 会看看更新了哪些东 ...

  8. 自带骚气的Python操作:把视频转换成字符动画

    作者 | 小k,专注于 Python 编程,推送各种 Python 干货文章,资源分享,面试真题,爬虫实战.数据分析.(来源:痴海) 编辑 | Emily 前言 谈到程序员,大家的马上想到" ...

  9. Kotlin修炼指南(三)——奇技淫巧

    Kotlin作为Android开发的首选语言,为开发者提供了大量的语法糖和技巧,让开发者可以专注于需求开发,而将语言所带来的影响减少到最少.Java和Kotlin最大的区别,实际上在于Kotlin的函 ...

最新文章

  1. 程序员崩溃了,年终奖怎么说黄就黄
  2. 将本地工程上传到github
  3. 删除vss文件批处理
  4. 传128GB版iPad4售价为799/929美元
  5. matlab 扫雷命令,Matlab版扫雷
  6. 【IoT】基于NB-IoT的CoAP协议浅析
  7. 匿名函数的简单理解和应用
  8. OpenCV:使用python-cv2实现Harr+Adaboost人脸识别
  9. 卷积神经网络的参数量和计算量
  10. matlab实现长除法,【网安智库】基于长除法的BCH(15,7)译码算法
  11. Java导出导入Excel方法
  12. 【FastDFS-V5.11】Linux下FastDFS+Nginx实现分布式图片服务器搭建详细教程(单机模式)
  13. java下载文件到本地
  14. vue html5 picker,详解VUE-地区选择器(V-Distpicker)组件使用心得
  15. 学习halcon之颜色识别
  16. 微管理:给你一个技术团队,你该怎么管札记-化繁为简
  17. 新时代知识产权创新发展与严格保护_保护知识产权?宣传强化治理——东安街道团结社区新时代文明实践站大力宣传《知识产权法》...
  18. 二重积分x^2+y^2_计算二重积分∫∫(x+y)dxdy,其中D为x^2+y^2≤2x
  19. 什么是信号完整性?(大白话)
  20. oracle的 listagg() WITHIN GROUP () 函数使用

热门文章

  1. 微信小程序 - 登录获取openid和用户信息(适配getUserProfile)
  2. cannot simultaneously fetch multiple bags
  3. 大数据领域就业和发展指南
  4. transition动画效果
  5. 张艾迪(创始人): 励志的路上
  6. ros订阅话题python_ROS之话题的发布与订阅
  7. 计算机网络:P3.3-数据链路层(下)
  8. 广州百田2015校园招聘笔试题
  9. 订单测试点(欢迎补充)
  10. 人民币转换为中文大写