Kotlin 定义函数的一些语法

fun main(args:Array<String>):Unit {

    val x:() -> Unit = { println("hello") } // 无参数函数,声明类型时用 ()-> 实现时不能要,{() -> println("hello")} 是错误的
val odd:(Int) -> Boolean = { x -> x % 2 ==1 } // 类型声明参数要放到括号中(即使只有一个参数
val add:(Int,Int) -> Int = { x,y -> x+y } //函数实现不能用括号即使有多个参数
val sum = { x:Array<Int> -> var s = 0;for(i in x) s+=i;s } }
fun main(args:Array<String>){ val is_odd:(Int)->Boolean = { x -> x % 2 == 1 }//类型声明中参数类型列表的括号不能省略
val is_even = { x:Int -> x % 2 == 0 }
val add:(Int,Int)->Int = { x , y -> x +y }
fun mul(x:Int,y:Int):Int = x * y // 这种定义的效率最高,其他的定义被编译成 extends Lambda implements Function2
val sub = fun(x:Int,y:Int) = x - y;
println(is_odd(2));
println(is_even(2));
println(add(2,3));
println(mul(2,3));
println(sub(2,3));
}

operator fun invoke

fun main(args:Array<String>):Unit {

    val x = A(3)//有参数构造函数不会与伴生对象定义的invoke()歧义,但是可能会和 invoke(x)歧义。
x();//调用实例对象定义在类中的invoke方法
A();//如果A有无参构造函数就会与 object invoke 的括号调用歧义,将无法直接用括号调用返回 world 的函数
B();//没有伴生类的对象定义invoke方法不会产生直接括号调用与无参构造函数的歧义
A("wengmj");//如果么有定义A.invoke(String)则定义的A.invoke函数有效
} class A(val x:Int)
{
init{
println("hello")
} operator fun invoke():Unit{
println("abc")
} companion object{
operator fun invoke():Unit{
println("world")
} operator fun invoke(x:String):Unit{
println(x)
}
}
} object B
{
operator fun invoke():Unit{
println("def")
}
}

实现一个可迭代的类

//传统的实现迭代接口方法
class A : Iterator<Int> {
val x = arrayOf(1,2,3,4,5).iterator();
override fun next(): Int = this.x.next();
override fun hasNext(): Boolean = this.x.hasNext();
}
// 实现 operator fun iterator()
class A {
val x = arrayOf(1,2,3,4,5).iterator();
operator fun iterator():Iterator<Int> = this.x.iterator();
}
//扩展一个已有的类使其可迭代
class A() {
val x = arrayOf(1,2,3,4,5).iterator();
}
operator fun A.iterator():Iterator<Int> = this.x.iterator();
fun main(args:Array<String>):Unit {
for(x in A())
println(x)
}

类扩展函数和属性

val String.hasChar:(Char) -> Boolean
get()= {c:Char -> this.any{ it == c}}

val String.leng:Int //类的属性扩展不能放在函数里:Local extension properties are not allowed
get() = this.length; fun main(args:Array<String>):Unit { fun String.len():Int{ //函数里定义扩展函数是可以的
return this.length;
}
println("hello".hasChar('e'))
println("hello".len())
println("hello".leng)
}

构造一个递归结构的列表

//扩展实现 IntRange to Array
fun IntProgression.toArray() = Array<Int>(( last - first) / step + 1 , { this.elementAt(it) })
fun main(args:Array<String>):Unit {
val p = (1..100 step 10).toArray();
val list = L<Int>(*p).push(1000) // 数组作为 vararg 参数,变量前加 *
print(sum(list))
}
//递归列表
class L<T> private constructor(val h:T,val t:L<T>?){
fun push(h:T):L<T> = L<T>(h,this);
companion object {
operator fun <T> invoke(vararg args:T):L<T> {
var x = L(args[0],null);
for(i in 1..args.lastIndex)
x = L(args[i],x);
return x;
}
}
}
//用于校验的递归求和函数
fun sum(list:L<Int>):Int {
with(list) {
if(t == null)
return h;
return h + sum(t)
}
}

泛型Demo

class A<T>(val name:T){
companion object{
fun <T> say(x:T){
println(x);
}
}
fun hello(){
println("hello ${this.name}");
}
}
fun main(args:Array<String>):Unit {
A.say<String>("hello");
A<Int>(123).hello();
}

匿名函数和λ表达式

fun main(args:Array<String>):Unit {

    val ins = arrayOf(-1,-2,1,2,3,4);
/*
如果一个函数用另一个函数作为它的最后一个参数, λ 表达式可以放在小括号外面的大括号中,
如果最后一个函数参数同时是唯一的参数则小括号也可以省略.
*/
val x = ins.filter { x -> x > 0 }
println(x)
//如果用匿名函数则只能放在小括号中
val y = ins.filter (fun(x:Int):Boolean { return x>0 });
println(y)
}

  

  

kotlin 练习的更多相关文章

  1. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  2. 用Kotlin实现Android定制视图(KAD 06)

    作者:Antonio Leiva 时间:Dec 27, 2016 原文链接:https://antonioleiva.com/custom-views-android-kotlin/ 在我们阅读有关c ...

  3. Kotlin与Android SDK 集成(KAD 05)

    作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Ko ...

  4. Kotlin的android扩展:对findViewById说再见(KAD 04)

    作者:Antonio Leiva 时间:Dec 12, 2016 原文链接:http://antonioleiva.com/kotlin-android-extensions/ 你也许已厌倦日复一日使 ...

  5. Kotlin类:功能更强、而更简洁(KAD 03)

    作者:Antonio Leiva 时间:Dec 7, 2016 原文链接:http://antonioleiva.com/classes-kotlin/ Kotlin类尽可能简单,这样用较少的代码完成 ...

  6. Kotlin中变量不同于Java: var 对val(KAD 02)

    原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...

  7. 用Kotlin创建第一个Android项目(KAD 01)

    原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...

  8. Android的Kotlin秘方(II):RecyclerView 和 DiffUtil

    作者:Antonio Leiva 时间:Sep 12, 2016 原文链接:http://antonioleiva.com/recyclerview-diffutil-kotlin/ 如你所知,在[支 ...

  9. Android的Kotlin秘方(I):OnGlobalLayoutListener

    春节后,又重新“开张”.各位高手请继续支持.谢谢! 原文标题:Kotlin recipes for Android (I): OnGlobalLayoutListener 原文链接:http://an ...

  10. KOTLIN开发语言文档(官方文档) -- 2.基本概念

    网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2.   基本概念 2.1.  基本类型 从可以在任何变量处理调用成员函数和属性 ...

随机推荐

  1. 使用PHP QR Code生成二维码

    使用PHP QR Code生成二维码   HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址: http://phpqrcode.so ...

  2. 复旦高等代数 II(15级)思考题

    1.设 $f(x)=x^n+a_{n-1}x^{n-1}+\cdots+a_1x+a_0$ 是整系数首一多项式, 满足: $|a_0|$ 是素数且 $$|a_0|>1+\sum_{i=1}^{n ...

  3. ECMAScript toString() 方法

    ECMAScript 定义所有对象都有 toString() 方法,无论它是伪对象,还是真对象. ECMAScript 的 Boolean 值.数字和字符串的原始值的有趣之处在于它们是伪对象,这意味着 ...

  4. tableLayoutPanel的使用

    https://msdn.microsoft.com/en-us/library/ms171687(v=vs.110).aspx Controls in a TableLayoutPanel cont ...

  5. 微信小程序-视图模板

    定义模板 使用name属性,作为模板的名字.然后在<template/>内定义代码片段,如: <!-- index: int msg: string time: string --& ...

  6. 在Linux中查看所有正在运行的进程

    可以使用ps命令.它能显示当前运行中进程的相关信息,包括进程的PID.Linux和UNIX都支持ps命令,显示所有运行中进程的相关信息. ps命令能提供一份当前进程的快照.如果想状态可以自动刷新,可以 ...

  7. exel按行查找或按列查找

    表1:sheet1 1). 在表1中找出ID号位0928的基因相对应的数值 在相对应的单元格输入:B2=VLOOKUP(A:A,Sheet1!A:D,3,0) 既可以得到: ············· ...

  8. 慕课网__HTML5 存储

    application cache 只能更新全部,不能更新单独的文件 在更新后,要重新打开浏览器,缓存才会生效, 不能实时生效

  9. /proc 【虚拟文件系统】

    在安装新硬件到 Linux 系统之前,你会想要知道当前系统的资源配置状况. Linux 将这类信息全集中在 /proc 文件系统下./proc 目录下的文件都是 Linux 内核虚拟出来的,当你读取它 ...

  10. redhat samba匿名登录服务器搭建

    smb服务器只需要yum install samba 安装起,并修改配置文件就可以匿名使用了.   smb配置文件,这里允许匿名登录.红色部分代表我共享出来文件夹参数code [root@localh ...