packagecoexamplblogimportjavutiArrayList//kotlinlambda作为函数参数时://函数作为另外一个函数的形参,可以直接写()->xxx的形式,不用额外再定义一个函数式接口//在调用时,世界将形参替换成lambd//问题:那还有必要保留函数式接口么?//函数式接口funinterfaceEven{funisEven(e:Int):Boolean}//非函数式接口interfaceOdd{funisOdd(e:Int):Boolean}classMyNumbers{privatevalnumberList=listOf(1,2,3,4,5,6,7,8,privatevalevenNumList=mutableListOf()privatevaloddNumList=mutableListOf()//传递一个函数第一种方式:传递一个函数式接口fungetAllEven(predictor:Eve:List{numberList.forEach{if(predictor.isEven(it)){evenNumList.add(it)}}returnevenNumList}//第二种方式,直接传递一个函数。这两种方式实质是一样的,只不过这种方式不需要额外在外部定义一个函数接口了,直接以匿名方式定义了一个接口,也就相当于直接传递了一个函数。fungetAllOdd(predictor:(Int)->Boolea:List{numberList.forEach{if(predictor(it)){oddNumList.add(it)}}returnoddNumList}}funmain(){varmyNumbers=MyNumbers()//for(iinmyNumbers.getAllEven()){//println(//}varevenPredictor=object:Even{overridefunisEven(e:Int):Boolean{returne%2==0}}//SAM表示方法,只能用在funinterface修饰的接口valevenPredictor2=Even{it%2==0}//从调用方看,不管是函数接受接口还是函数,调用房都可以传lambda,间接印证传函数式接口和函数是一回事。varallEven=myNumbers.getAllEven(evenPredictor//另一种方式varallEven2=myNumbers.getAllEven{it%2==0}println('Theevennumbersare:')for(iinallEve{println(}println('Theoddnumbersare:')varallOdd=myNumbers.getAllOdd{it%2!=0}for(iinallOd{println(}}
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点