kotlin推荐分享.md
什么是kotlin
Kotlin是一种在Java虚拟机上执行的静态类型编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言(其实就是IDEA) 他已经被默认为Android的首选开发语言
为什么推荐kt/gradle
因为节省代码量。提高编译速度包括异常处理之类的。 这里就不推荐基础语法了。直接上语法糖。看看大家能怎样减少工作量 而且关键是spring最新版本支持kotlin。并且放弃maven编译。只支持gradle
常见语法糖
空指针判断
var a: String = "abc" // 默认情况下,常规初始化意味着非空
a = null // 编译错误
var b: String? = "abc" // 可以设置为空
b = null // ok
print(b)
明确了可空和不可空不是同一类型。你假如指定了一个可空变成不可空。那么会编译报错。这样就会在编译期间防止空指针异常了
那么除了这个区分类型还有什么用了。有。比如你没有数据的时候你想来个默认值
这个叫 Elvis 操作符
class A{
val b:B?
}
class B{
val c:string?
}
val a=A();
a.b==null
正常情况下假如缺少数据的时候。或者有多层对象的时候。你可以通过这样的写法表示
val text=a.b?.c?:"默认值"
那么java推荐模式是什么
B b=Optional.ofNullable(A.b).orElse(new B())
String text=Optional.ofNullable(b.text).orElse("")
Getter 和 Setter与Lombok
想必大家都开始用了lombok。有效的减少了开发的工作量。再也不用手写setter和getter方法。但在koltin里面。你申明的方法自动带setter和getter.完全不需要再去写. 相当于内置了Lombok
还可以像python一样修改默认的get和set。实现字段操作的拦截
class a{
var A:String =""
set(values){
field=A+"_"
}
}
还有完全的数据类
data class A(var A:String="",val b:String="xxx");
data class自动生成构造函数。作为一个纯粹的数据object
模式匹配
想必大家用switch做分支的时候经常会这样使用
public void test1() {
int item = 3;
switch (item) {
case 1:
System.out.println(1);
break;
case 2:
System.out.println(2);
break;
case 3:
System.out.println(3);
break;
default:
System.out.println(0);
}
}
kotlin这么写
fun test1() {
val item = 3
when (item) {
1 -> println(1)
2 -> println(2)
3 -> println(3)
else -> println(0)
}
}
你以为这样就结束了?
不还可以这样写
```kotlin
fun test1() {
val item = 3
when {
item==1 -> println(1)
item is Integer -> println(2)
item*3==9 -> println(3)
item in 4..9 -> println(9)
else -> println(0)
}
}
when 将它的参数与所有的分支条件顺序比较,直到某个分支满足条件。 when 既可以被当做表达式使用也可以被当做语句使用。如果它被当做表达式, 符合条件的分支的值就是整个表达式的值,如果当做语句使用, 则忽略个别分支的值。(像 if 一样,每一个分支可以是一个代码块,它的值是块中最后的表达式的值。)
标准函数
有let,apply,with,run 但这些事干什么用的。又是一个非常棒的语法糖
let 扩展函数是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,可以使用let函数。
object.let{
it.todo()//在函数体内使用it替代object对象去访问其公有的属性和方法
}
比如如下
public void test(String var2) {
if(var2!=null){
System.out.println(var2.length());//输出 7
int result = 1000;
System.out.println(result); //输出 1000
}
}
public void test(String arg) {
arg?.let{
println(this.length());
val result=1000;
println(result*this);
}
}
对。这样写可以默认执行某个操作而不影响arg的
那么同样有需求。假如是不为空。我更新var2的值。而为空则不变呢? 就用到run就可以了
public void test(String arg) {
val arg2=arg?.run{
println(this.length());
val result=1000;
return result*this;
}
}
inline函数
有时候你想给一个Class添加方法。你却没有编辑的权限。你只能写一个静态方法类。
把原有对象传递进去
public static B AconvertToB(A a){
B b=new B();
return b;
}
而在kotlin中。你可以在任意文件中写这样的函数。表示是这个对象才拥有这个方法
fun A.convertB():B{
B b=new B();
return b;
}
相比找函数。这里可以默认通过A类型找到关联的函数。方便调用和整理
单列模式
在java有个设计模型叫单列模式。大家都清楚。在kotlin里面只要申明是object就行.这个就默认单列模式了
object A{
fun a:String()
}
lambada函数
更简洁和完善的lambada。 比如说java里面生成map类型
List<LfRchgUnitPrice> list=new ArrayList();
Map<String, LfRchgUnitPrice> pricesMapper = list.stream().collect(Collectors.toMap(LfRchgUnitPrice::getCorpCode, Function.identity()));
val list=ArrayList();
val pricesMapper:Map<String, LfRchgUnitPrice> = list.associateBy{it.getCorpCode()}
没有看错。就这么简单.
assocateBy假如遇到重复的key会默认覆盖。不会报错。但是java就不行
除了这个。还有groupBy(多条数据的时候生成的是List)
Map<String, List<LfRchgUnitPrice>> = list.groupBy{it.getCorpCode()};
系统默认函数
假如你获取一个数据。假如是用户没有传.是一个String。他有可能是”“.或者是一个非法字符串。或者是其他的。假如出现异常数据。我这些想通通忽略掉。 那java这样写
public static Integer toInteger(String number){
try {
return Integer.valueOf(number);
}
catch (Exception e){
log.error("转换Int失败"+number,e);
return null;
}
}
public void test()
{
toInteger("xxxx")
}
val text="xxx"
val data=A.toIntOrNull()
#更方便的是可以写成下面样式
val data=A.toIntOrNull()?:0
自带协程
kotlin 语义默认支持协程。对于一个复杂而耗时的任务。有可能在java里面肯能要调用线程词。而在kotlin里面线程池就可以了
怎么开始
很简单。只要项目是gradle的。可以直接通过简单的配置就变成支持java和kotlin的双语言项目。完全可以做到有些开发java有些开发kotlin。互相不冲突。
一般大家开始的时候都是习惯按java方式写kotlin。这也没关系。但是直到一定时间后就默默的会用起来各种语法糖。而且idea也会提示你怎样的想法更适合kotlin的语法