Kotlin教程学习-字符串拼接,数组,List

2023-05-16

摘要: Kotlin是一种优雅的语言,是JetBrains公司开发的JVM语言,与Java有着极密切的联系,Kotlin有着怎样的魅力呢?

首先看到的就是import语句,这个很好理解,既然Kotlin有包的概念,自然就可以使用import语句引用其他包下面写好的Kotlin类(顺便提一下,Kotlin是面向对象的语言).不过令我们惊奇的是java.util.Arrays,这不是Java的类库里面的吗?难道JetBrains吃多了把所有Java类库都移植到了Kotlin上面?答案其实很简单,因为Kotlin和Java都是JVM语言,所以100%兼容(官网说是100%),因此在Kotlin中使用class文件完全不需要移植(笑,Kotlin本来最后也会被编译为class文件).换句话说,包括Java,Groovy,Scala在内的这些JVM语言写的代码,只要编译为class文件后,就可以在Kotlin中轻松引用.虽然在源代码级别不兼容(不能在一个源文件中混合使用几种语言),但是在JVM级别是兼容的.同样的,在其他JVM语言中也可以直接引用Kotlin的代码.

比如在Java中引用Kotlin


可以看到这是Java代码,调用了前面写的string_template函数.通过这个代码我们可以发现一些有趣的事情(string_template函数定义在BasicPackage类中),这很奇怪,因为我们并没有写BasicPackage类.我们前面写的Kotlin代码并没有使用class(函数并不是在类中定义的),但是Kotlin是面向对象的语言,Kotlin中一切都是对象,在Kotlin中甚至连原始类型都没有,前面我们在Kotlin中看到的Int,Long都是对象.那么这个BasicPackage类是怎么来的呢?

其实我们前面所写的Kotlin代码看起来虽然是全局函数,实际上却被局限在一个包中,Kotlin自动在每一个包中帮我们定义了一个默认的类,这个BasicPackage类就是默认类的名字(包名+Package),如果我们写的函数不是在类里面定义的,就会被自动归类到这个默认的类里面(换句话说虽然前面我们并没有编写类,但是所有函数都被放到一个默认的类中了),实际上在Kotlin中只有这种默认类里面的main函数才可以作为程序入口被执行,如果你把main函数写在普通的Kotlin类中是不能作为程序入口的.

再看string_template函数,可以发现字符串可以使用{} 和等方法进行替换,这种字符串处理的风格大概是从Unix脚本里面继承过来的吧.关于字符串还有很多其他的库函数.

再看arr_test函数,在Kotlin中,数组其实是一个Array<>模版,使用arrayOf函数进行初始化,不过和Java中一样,仍然需要使用Arrays.toString()来进行输出.在Kotlin中数组其实已经几乎不能称之为数组了,在Kotlin中数组更像是 一个Collection,提供了Iterator,有get和set方法,不像Java数组有很多内置特性.

最后再看list_test函数,通过listOf函数创建了一个list对象,再使用+=操作添加了一个元素,然后通过filter方法将长度大于1的元素挑选出来放到新的List对象(posi)里面去.

函数输出如下:

等等,+=也就算了,那个filter是函数调用?怎么看起来这么奇怪,连圆括号都不见了.

其实filter函数是这样的

圆括号只是被省略了,WTF,这也能省略!其实Kotlin代码可以很简洁,代码量很少,在Kotlin代码中省略很常见.

但是仍然存在问题,filter的参数好奇怪,使用大括号括起来,而且还有->运算符.明眼人可能已经知道了,->肯定不是指针.

实际filter函数的参数是一个函数,这里又是一个lambda.

才学习Kotlin几天,就第二次碰到了lambda(说起来我对lambda也不是很了解),事实上lambda表达式可以大大减少代码量,但是却增加了代码的阅读难度(尤其对于如我这样的编程新手,笑).在C++中有函数指针的概念(当然现在C++也有lambda),将函数作为参数也不是什么罕见的事.

如果大家看不明白,可以换一个写法


相信这样写就明白了,这里定义了一个select函数,判断字符串长度是否大于1,再将select函数作为参数传入filter函数中,在filter函数中对每一个元素都调用select函数进行选择,如果返回true则被选中,返回false则不被选中,所以最后posi其实就是把l中所有长度大于1的字符串选出来了,这就是filter函数(是不是和C++里面的函数指针作为参数很像).

但是这一次我们又看到了一些有趣的东西,

l filter中间没有”.”号,你没有看错,我也没有写错.对,你猜得没错,”.”又被省略了,这个在Kotlin中叫做infix function call:中缀函数调用

其实前面说了,括号也可以省略,所以地道的infix function call其实是这样的


就是空格分隔而已,还有::域限定符,要是把::select换成lambda表达式,恐怕连神鬼都怕


没错,你没有看错,lambda表达式也可以简化,WTF!!!  { ix -> ix.length() > 1 }居然被简化成了 { it.length() > 1 }

it是一个iterator迭代器,内置的,只能是it,不能是其它的名字

通过一条语句的各种变化可以看到,在Kotlin中语法之灵活让人发指,代码量虽然可以大幅减少,但是省略和lambda的大量使用,对于没有接触过编程的人来说简直就是一场灾难.或许这就是优雅的代价.

说起来我也是才学习Kotlin呢(笑),Kotlin特性之多之复杂足以让人望而却步,不过为了优雅我也是要拼了.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin教程学习-字符串拼接,数组,List 的相关文章

随机推荐

  • C语言状态机学习笔记一

    出处 xff1a http www cnblogs com tangerious p 4565833 html 状态机的好处不用多说 xff0c 自己百度去 xff0c 但传统的编程模式 xff0c 无论是C语言 xff0c 或是硬件FPG
  • 单片机课设-60秒倒计时器

    proteus单片机实现60秒倒计时器 项目要实现的60s秒表倒计时器 xff0c 用 AT89C51单片机的定时 计数器 T0 产生一秒的定时时间 xff0c 实现 59 到 0秒的循环显示的功能 具体要求 xff1a 1 xff09 按
  • 位运算的操作(加减乘除、负数、乘方、1的个数)

    一 位运算相关规律 43 口诀 c 43 43 中的位运算相关规律总结和口诀 二 加减乘除 int add int num1 int num2 int temp do temp 61 num1 num2 不进位相加 xff1a 异或 num
  • PgSQL upsert批量查询插入或更新(insert select/on conflict do update踩坑记录)

    PGSQL数据库中根据唯一索引判断存在不存在 xff0c 存在则更新 xff0c 不存在就新增 xff0c 可以参考下的sql xff0c 注意其中的item type item type id item group item group
  • 程序员必备的11个Github优质项目

    GitHub 不仅仅是一个版本控制服务 xff0c 它还是一个了不起的内容资源 xff0c 从免费的电子书和教程 xff0c 到面试准备材料和 34 了不起 34 的文章 xff0c 应有尽有 如果你是经常访问GitHub的开发者 xff0
  • spring为什么要使用三级缓存来解决循环依赖?

    不用三级缓存 xff0c 用二级缓存能不能解决循环依赖 这里我先说一下前面没提到的细节 xff0c 那就是通过ObjectFactory获取的Bean可能是两种类型 xff0c 第一种就是实例化阶段创建出来的对象 xff0c 还是一种就是实
  • nginx事件模块

    1 模块依赖 2 基础数据结构 2 1 ngx event t struct ngx event s void data unsigned write 1 unsigned accept 1 used to detect the stale
  • Object.create(null)与let o = {}区别

    在阅读 vue 源码中 xff0c 会看到使用Object create null 来创建不带有属性的对象 为什么不使用let o 61 呢 xff1f 因为使用let o 61 xff0c 对象o还是继承Object xff0c 会继承O
  • javascript之字符串

    replace replace pattern replacement 字段说明pattern字符串或者具有Symbol replace方法的对象replacement可以是字符串或者函数 字符串时 xff0c 会替换pattern匹配的子
  • win10重装遇到的问题

    今天在重装win10系统时遇到几个问题 xff0c 折腾了一整天 win10计算机意外地重新启动或遇到错误 解决方法 1 在出现错误提示的界面中我们按 Shift 43 F10 打开命令提示符 2 在命令提示符中输入 cd oobe xff
  • Arduino IDE搭建ESP8266开发环境,开发包下载过慢解决方法

    Arduino IDE搭建ESP8266开发环境 xff0c 开发板管理器中下载过慢解决方法 方法一 xff1a 1 首选项 附加开发板管理器网址 xff1a http arduino esp8266 com stable package
  • CheckBox的使用(一):onCheckedChanged事件

    重写接口 public void onCheckedChanged CompoundButton buttonView boolean isChecked package com example androidtest import and
  • 指针与引用的关系

    c xff0b xff0b 中的引用与指针的区别 相同点 xff1a 1 都是地址的概念 xff1b 指针指向一块内存 xff0c 它的内容是所指内存的地址 xff1b 引用是某块内存的别名 区别 xff1a 1 指针是一个实体 xff0c
  • C&C++图形图像处理开源库

    Google三维APIO3D O3D 是一个开源的 WebAPI 用来在浏览器上创建界面丰富的交互式的 3D 应用程序 这是一种基于网页的可控3D标准 此格式期望真正的基于浏览器 xff0c 独立于操作系统之外 xff0c 并且支持主流的3
  • protobuf的ParseFromArray 解析失败的问题

    前段时间 xff0c 在解析定义的Message时 xff0c 总是提示解析失败 xff0c 刚开始以为是消息号与消息没有对应上 xff0c 检查后发现消息号与消息是对应的 后来发现消息的一个字段定义为required 但是没有赋值 xff
  • Incorrect number of FETCH variables

    在写存储过程 xff0c 运行后提示 Incorrect number of FETCH variables 原来是用游标select的字段数需要与fetch into的变量数一致 修改后的如下 xff1a DROP PROCEDURE I
  • phpStorm 2016.1 最新版激活方法

    新版激活方法 1 在线激活 最新 http 123 206 193 241 1017 http www 0 php com 1017 xff08 可用 xff0c 更新于 20170621 xff09 http idea singee77
  • Android EditText最大字数限制并提示

    public class MaxTextLengthFilter implements InputFilter private int mMaxLength 构造方法中传入最多能输入的字数 public MaxTextLengthFilte
  • Android调用系统, 任意比例裁剪图片

    废话不多说 直接上代码 核心代码 span class hljs javadoc 跳转到系统裁剪图片页面 span class hljs javadoctag 64 param span imagePath 需要裁剪的图片路径 span s
  • Kotlin教程学习-字符串拼接,数组,List

    摘要 Kotlin是一种优雅的语言 是JetBrains公司开发的JVM语言 与Java有着极密切的联系 Kotlin有着怎样的魅力呢 首先看到的就是import语句 这个很好理解 既然Kotlin有包的概念 自然就可以使用import语句