前言
上节我们讲到了所有类的超类Any的使用,大家有需要了解的可参看以下文章:
[1]Kotlin中的算数运算
[2]二元运算符 ?:
[3]Any的使用 - 简书
[4]数组
今天让我们来学习一下Predicate的相关知识,涉及内容有:
1.什么是Predicate
2.Predicate初始化方式
3.封装类PredicateUtil的使用
4.PredicateUtil源码
5.需要注意的问题
一. 什么是Predicate
Predicate是断言接口,主要用于条件判断。其与Boolean的不同点在于,Boolean只能作为单个条件判断,逻辑能力较弱,而Predicate由于包含逻辑词and,or和negate(非)的运用,可以使判断条件非常的丰富,条件判断的扩展性比Boolean强很多
二. Predicate 初始化方式
Predicate作为一个接口类,其初始化需要带一个方法体,我们可以用一下方式来初始化一个Predicate:
//方式一:
var predicate: Predicate<String> = object : Predicate<String> {
override fun test(s: String): Boolean {
return s.length > 3
}
}
//方式二:
var predicate: Predicate<String> = Predicate { s -> s.length > 5 }
三.封装类 PredicateUtil 的使用
为了Predicate的方便使用,这里我们封装了一个工具类PredicateUtil,下面看下它在MainActivity中的使用:
package com.example.kdemo.ui.test
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import com.example.kdemo.R
import com.example.kdemo.databinding.ActivityTestBinding
import com.example.kdemo.util.data.collection.ListUtil
import com.example.kdemo.util.data.normal.PredicateUtil
import com.example.kdemo.util.log.LogUtil
import com.example.kdemo.util.toast.ToastUtil
import java.util.function.Predicate
import java.util.stream.Collector
import java.util.stream.Collectors
import java.util.stream.Stream
class TestActivity : AppCompatActivity(),View.OnClickListener {
private lateinit var mBinding: ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityTestBinding.inflate(layoutInflater)
setContentView(mBinding.root)
initData()
setListener()
}
private fun initData() {}
private fun setListener() {
mBinding.mBtnTest.setOnClickListener(this)
}
@RequiresApi(Build.VERSION_CODES.Q)
override fun onClick(view: View) {
when (view.id) {
R.id.mBtnTest -> {
test()
}
else -> {
}
}
}
@RequiresApi(Build.VERSION_CODES.Q)
private fun test() {
ToastUtil.showShortToast(this, "begin test")
var nameList = mutableListOf("ad", "bk", "bk971","ac", "a11", "f1234", "g2578", "p2978f", "a2578k")
var predicate1 = Predicate<String> { s ->s.startsWith("a")} //以a开头
var predicate2 = Predicate<String> { s ->s.length>4} //长度大于4
LogUtil.i("==and的使用如下=====")
nameList.filter { PredicateUtil.test(PredicateUtil.and(predicate1,predicate2), it) }.forEach(LogUtil::i)
LogUtil.i("==or的使用如下=====")
nameList.filter { PredicateUtil.test(PredicateUtil.or(predicate1,predicate2), it) }.forEach(LogUtil::i)
LogUtil.i("==negate的使用如下=====")
nameList.filter { PredicateUtil.test(PredicateUtil.negate(predicate1), it) }.forEach(LogUtil::i)
}
}
运行结果如下:
20:41:24.175 I ==and的使用如下=====
20:41:24.176 I a2578k
20:41:24.176 I ==or的使用如下=====
20:41:24.176 I ad
20:41:24.176 I bk971
20:41:24.176 I ac
20:41:24.176 I a11
20:41:24.176 I f1234
20:41:24.177 I g2578
20:41:24.177 I p2978f
20:41:24.177 I a2578k
20:41:24.177 I ==negate的使用如下=====
20:41:24.177 I bk
20:41:24.177 I bk971
20:41:24.177 I f1234
20:41:24.177 I g2578
20:41:24.177 I p2978f
四. PredicateUtil 源码
下面给出PredicateUtil源码: