kotlin 函数式接口和匿名接口、lambda

package com.example.blog

import java.util.ArrayList

//kotlin lambda作为函数参数时:
//1. 函数作为另外一个函数的形参,可以直接写()-> xxx的形式,不用额外再定义一个函数式接口
//2. 在调用时, 世界将形参替换成lambda.
//问题:那还有必要保留函数式接口么?

//函数式接口
fun interface Even{
    fun isEven(e: Int): Boolean
}
//非函数式接口
interface  Odd{
    fun isOdd(e: Int): Boolean
}

class MyNumbers{
    private val numberList = listOf(1,2,3,4,5,6,7,8,9)
    private val evenNumList = mutableListOf<Int>()
    private val oddNumList = mutableListOf<Int>()

    //传递一个函数第一种方式: 传递一个函数式接口
    fun getAllEven(predictor: Even): List<Int>{

        numberList.forEach {
            if (predictor.isEven(it)) {
                evenNumList.add(it)
            }
        }
        return evenNumList
    }
    //第二种方式,直接传递一个函数。这两种方式实质是一样的,只不过这种方式不需要额外在外部定义一个函数接口了,直接以匿名方式定义了一个接口,也就相当于直接传递了一个函数。
    fun getAllOdd(predictor: (Int) -> Boolean): List<Int>{
        numberList.forEach {
            if (predictor(it)) {
                oddNumList.add(it)
            }
        }
        return oddNumList
    }
}

fun main(){
    var myNumbers = MyNumbers()
//    for (i in myNumbers.getAllEven()) {
//        println(i)
//    }

  var evenPredictor = object : Even {
      override fun isEven(e: Int): Boolean {
          return e % 2 == 0
      }
  }
    //SAM 表示方法,只能用在fun interface修饰的接口
    val evenPredictor2 = Even{
        it % 2 == 0
    }
    //从调用方看,不管是函数接受接口还是函数,调用房都可以传lambda,间接印证传函数式接口和函数是一回事。
    var allEven = myNumbers.getAllEven(evenPredictor2)
    //另一种方式
    var allEven2 = myNumbers.getAllEven { it % 2 == 0 }
    println("The even numbers are: ")
    for (i in allEven) {
        println(i)
    }
    println("The odd numbers are: ")
    var allOdd = myNumbers.getAllOdd { it % 2 != 0 }
    for (i in allOdd) {
        println(i)
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值