Kotlin对比Java 入门学习记录(贰)

Kotlin入门学习记录
2023/11/26

匿名函数

无名函数,如下

//count中传的参数就是匿名函数
var total = "Mississippi".count( { letter ->
        letter == 's'
})

函数类型

和Integer String等类型变量声明一样
函数也可以作为一个类型进行声明变量,如下
注意
匿名函数的最后一行为返回值 不用写return

//此处声明了一个无参返回类型为String的函数变量
val blessingFunction:() -> String
blessingFunction = {
	var hailday = "new year"
	"hello $hailday" 
}

利用KT的类型推断特性进行简写,如下
注意
此处与Java中的静态代码块不同

val blessingFunction = {
    val hoilday = "new year"
    "hello $hoilday"
}

函数参数

(函数参数) -> 返回类型 = 参数变量名 -> ,如下

val blessingFunction:(String) -> String = { name ->
	val hoilday = "new year"
    "$name hello $hoilday"
}
println(blessingFunction("LY_C"))

it关键字

当匿名函数中只有一个参数时
可以使用it代替函数变量名,如下

val blessingFunction:(String) -> String = {
    val hoilday = "new year"
    "$it hello $hoilday"
}
println(blessingFunction("LY_C"))

利用KT的类型推断特性进行简写,如下

val blessingFunction = { name ->
    val hoilday = "new year"
    "$name hello $hoilday"
}
println(blessingFunction("LY_C"))

lambda表达式

在函数类型中赋值的匿名函数就是lambda

参数为函数的函数

就是将函数类型当作参数传递,如下

fun main() {
	//函数类型变量
    val getDiscountWords = { goodsName:String,hour:Int ->
        val currentYear = 2017
        "${currentYear}${goodsName} 促销倒计时${hour}小时"
    }
    showOnBoard("卫生纸",getDiscountWords)
}
fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){
    val hour = (1..24).shuffled().last()
    println(getDiscountWords(goodName,hour))
}

Java中可以使用接口达到类似的效果,如下

public interface GetDiscountWords {
    String getDiscountWords(String goodsName,int hour);
}
class Main{
    public static void main(String[] args) {
        showOnBoard("卫生纸", new GetDiscountWords() {
            @Override
            public String getDiscountWords(String goodsName, int hour) {
                int currentYear = 2017;
                return currentYear+"年 "+ goodsName+" 促销倒计时 "+hour+"小时";
            }
        });
    }
    public static void showOnBoard(String goodsName, GetDiscountWords g){
        int hour = 24;
        System.out.println(goodsName+g.getDiscountWords(goodsName,hour));
    }
}

简略写法

如果一个lambda参数排在最后或者是唯一参数,圆括号可以省略,如下

fun main() {
	//"LY_CY_CY_CY_C".count(){it == 'C'}
	"LY_CY_CY_CY_C".count{it == 'C'}
	//
    showOnBoard("卫生纸",getDiscountWords){goodsName:String,hour:Int ->
        val currentYear = 2017
        "${currentYear}${goodsName} 促销倒计时${hour}小时"
    }
}
fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){
    val hour = (1..24).shuffled().last()
    println(getDiscountWords(goodName,hour))
}

函数内联

关键字
inline
在使用lambda时JVM会自动创建一个实例对象,会加大内存开销严重影响性能,所以引入内联解决这一问题,内联的处理方式就是那里使用粘哪里,如下

fun main(){
    showOnBoard("卫生纸"){ goodsName:String,hour:Int ->
        val currentYear = 2017
        "${currentYear}${goodsName} 促销倒计时${hour}小时"
    }
}
inline fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){
    val hour = (1..24).shuffled().last()
    println(getDiscountWords(goodName,hour))
}

注意
lambda的递归函数不能使用内联inline否则会导致死循环

函数引用

在传递函数类型给函数时除了使用lamdba还可以使用::引用函数,如下

fun main(){
    showOnBoard("卫生纸",::getDiscountWords)
}
fun getDiscountWords(goodsName:String,hour:Int):String{
    val currentYear = 2017
    return "${currentYear}${goodsName} 促销倒计时${hour}小时"
}
fun showOnBoard(goodName:String,getDiscountWords:(String,Int)->String){
    val hour = (1..24).shuffled().last()
    println(getDiscountWords(goodName,hour))
}

函数类型为返回值的函数

就是将函数类型当作返回值传递,如下

fun main() {
	//此处调用了configDiscountWord函数返回函数类型
    var getDiscountWords = configDiscountWord();
    println(getDiscountWords("纸巾"))
}
fun configDiscountWord():(String)->String{
    val currentYear = 2027
    var hour = (1..24).shuffled().last()
    return {
        hour += 20
        "${currentYear}年 {$it} 促销倒计时 ${hour}"
    }
}

闭包

匿名函数=lambda=闭包,lambda可以调用自己作用域之外的变量,本质作用是作用域控制?

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuKey_C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值