文档章节

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

天命剑主
 天命剑主
发布于 2015/06/14 10:46
字数 1583
阅读 906
收藏 1
点赞 4
评论 0

首先看到的就是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特性之多之复杂足以让人望而却步,不过为了优雅我也是要拼了.

© 著作权归作者所有

共有 人打赏支持
天命剑主
粉丝 39
博文 16
码字总数 9621
作品 0
武汉
程序员
分享下学习Kotlin的历程-数据类型(2)

转载请注明出处王亟亟的大牛之路 开篇之前还是老规矩,先安利https://github.com/ddwhan0123/Useful-Open-Source-Android 还是尽量每天做更新和维护 上一篇讲了Kotlin的简单数据结构,这一把...

ddwhan0123
2017/09/05
0
0
从零开始学Kotlin-数据类型(2)

从零开始学Kotlin-基础语法(1) 从零开始学Kotlin-数据类型(2) 基本数据类型 Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等; 常量表示(不支持8进制) 为了使数字易...

SiberianDante
01/07
0
0
Kotlin学习之常用高阶函数:map

Kotlin学习之常用高阶函数:map Map的中文意思是“映射”,它既可以作名词,也可以是动词。 一、Map系列 Array的map函数如下: 与filter相似,它也是委托给mapTo()方法实现: mapTo()函数接受...

Hunter_Arley
01/11
0
0
如何使用tensorflow做张量排序和字符串拼接?

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴...

天善智能
07/17
0
0
为什么我要改用Kotlin

写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望。为了趁热打铁,我决定提前三天放出原定本周日Release的文章。希望能及时让大家了解一下Kot...

技术小黑屋
2017/05/18
0
0
Android 开发者自述:为什么我要改用 Kotlin?

编者注:Google I/O 2017 首日 Keynote 刚刚落幕,其中 Google 宣布 Android 系统将对 Kotlin 提供 first-class 的支持算是一个非常重磅的新闻。对于大众来说,Kotlin 编程语言可能是相对陌生...

两味真火
2017/05/19
10.2K
98
Eyepetizer-in-Kotlin:一款简约的小视频app,带你走进kotlin

Google在今年的IO大会上宣布,将Kotlin作为Android开发的一级语言。作为紧跟潮流的弄潮儿,对kotlin稍做了解后,发现其有优秀的特性,所以就开始了学习,而Eyepetizer-in-Kotlin便是对kotli...

Ruheng
2017/07/12
0
0
kotlin学习笔记-异常好玩的list集合总结

不积跬步无以至千里,不积小流无以成江海 先看看Kotlin中for循环的遍历 kotlin和Java中的集合工具类 Java中集合及其工具类 Kotlin中Java中集合及其工具类 List MutableList Set MutableSet Ma...

codeGoogle
07/16
0
0
Kotlin in Action 学习笔记 (1)

Kotlin 是以俄罗斯圣彼得堡附近的一座岛屿命名 Kotlin 是一门全新的针对 Java 平台的新编程的语言,百分之百与 Java 兼容,它是一门静态类型的语言,并且支持类型推导 先从书中的第一段代码来...

realxz
2017/12/14
0
0
Kotlin:基本类型都是对象,原生类型将成为回忆

在Kotlin中,所有东西都是对象,我们可以在任何变量(如基本类型:数字、字符、布尔、数组与字符串等)上调用成员函数和属性。 一、数字 1. 内置类型种类 Kotlin提供了如下内置类型来表示数据...

p106786860
2017/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python以太坊类库web3.py概览

python通过web3.py库与以太坊交互共同入口是web3对象。web3对象提供API接口,python开发应用与以太坊进行交互如钱包创建、支付、转账等连接JSON-RPC服务器进行。 Providers提供者 Providers使...

智能合约
1分钟前
0
0
【Android学习笔记】设置App启动页

先将启动页放到项目资源中,图片一般是1080*1920的jpg。 新建一个activity,如图: 创建成功之后,打开刚刚创建的activity,来进行代码的编写: >>>阅读全文

全部原谅
2分钟前
0
0
什么是React-redux、为什么使用React-redux、怎么使用React-redux

1、什么是React-redux React-redux是用于连接React和Redux的 2、为什么使用React-redux 使用React-redux可以使redux部分代码更简洁更明了,比如组建中需要使用到的数据都在mapStateToProps方...

kimyeongnam
5分钟前
0
0
Spring核心——Stereotype组件与Bean扫描

在注解自动装载中介绍了通过注解(Annotation)自动向Bean中注入其他Bean的方法,本篇将介绍通过注解(Annotation)向容器添加Bean的方法。 Spring的核心容器提供了@Component和@Bean注解来标...

随风溜达的向日葵
5分钟前
0
0
利用世界杯,读懂 Python 装饰器

Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic。 今天就结合最近的世界杯带大家理解下装饰器。...

猫咪编程
8分钟前
0
0
flink fold example

flink fold例子 import org.apache.flink.api.common.functions.*;import org.apache.flink.streaming.api.datastream.DataStream;import org.apache.flink.streaming.api.environment.S......

coord
9分钟前
0
0
c++ qt 组播总结

每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂。 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看...

backtrackx
14分钟前
0
0
Sublime text2安装json格式化插件SublimePrettyJson[Windows]

一、下载SublimePrettyJson插件包 https://github.com/dzhibas/SublimePrettyJson 二、将下载的文件解压放到在package目录下面 C:\Users\lucky\AppData\Roaming\Sublime Text 3\Packages 每个......

lazy~
14分钟前
0
0
安装vue-cli 报4058错误

1. 4058是网络代理错误。 安装淘宝源修改一下就可以了: npm --registry https://registry.npm.taobao.org info underscore 改为cnpm执行: cnpm install --global vue-cli 安装成功: 试试版...

MrBoyce
15分钟前
0
0
CPU飙升分析

1、top -----看具体的进程 2、top -H -p pid ------该进程的线程 3、printf 0x%x 15248 ------将线程改为16进制 4、jstack 进程...

北极之北
18分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部