运算符重载 高阶函数

2020-12-26  本文已影响0人  闪客飞飞

委托属性
class Foo{
var p:Type by Delegate()
}

使用委托属性: 惰性初始化 和 by lazy()

lazy 默认情况下是线程安全的

高阶函数:以另一个函数作为参数或者返回值的函数

定义一个高阶函数
fun twoAndThree(operation:(Int,Int)->Int){
val result=operation(2,4)
println("this result is ${result})
}

twoAndThree{a,b->a=b}

函数声明:
fun String.filter(predicate:(Char)->Boolean):String{}
返回值类型 参数类型 参数的返回值类型

fun String.filter(predicate:(Char)->Boolean):String{
val sb=StringBuilder();
for(index in 0 until length){
if(predicate(get(index))) sb.appeng(get(index))
}
return sb.ToString()
}

返回函数的函数
enum class Delivery {STANDARD,EXPENDITED }
class Order(val itemcount:Int)

fun getShippingCostCalculator( delivery:Delivery):(Order)->Double{
if(delivery == Delivery.STANDARD){
return {order->6+2.1order.itemCount}
}
return {order->1.2
order.itemCount}
}

val calculator= getShippingCostCalculator(Deliver.STANDARD)
println(calculator(Order(3)))

内联函数inline
标记一个函数,在函数被使用的时候编译器并不会生成函数调用的代码而是使用函数实现的真实代码替换每一次的函数调用。j减少开销不会产生额外的类和对象,

声明带实化类型的函数
函数声成用inline 并且用reififed 标记类型的参数您就能该函数检测Value 是不是T的实例了

inline fun <feified T> isA (value :Any) =value is T
println(isA<String>("abe")) true
println(isA<String>(123)) false

标准库函数 filterIsInstance 这个函数接受一个集合然后选择指定类的实例 然后返回这些被选中的实例

val items=listof("one",1,"two")
println(items.filterIsInstance<String>()) ["one","two"] 在返回的时候类型的实参已知了

inline fun <reified T> Iterable<*>.filterIsInstance():List<T>{
val destination =mutableListOf<T>()
for( element in this){
if(element is T){`
destination.add(element)
}
}
return destination
}

上一篇 下一篇

猜你喜欢

热点阅读