[5]Predicate的使用

前言

上節(jié)我們講到了所有類的超類Any的使用,大家有需要了解的可參看以下文章:
[1]Kotlin中的算數(shù)運算
[2]二元運算符 ?:
[3]Any的使用 - 簡書
[4]數(shù)組
今天讓我們來學(xué)習(xí)一下Predicate的相關(guān)知識,涉及內(nèi)容有:
1.什么是Predicate
2.Predicate初始化方式
3.封裝類PredicateUtil的使用
4.PredicateUtil源碼
5.需要注意的問題

一. 什么是Predicate

Predicate是斷言接口,主要用于條件判斷。其與Boolean的不同點在于,Boolean只能作為單個條件判斷,邏輯能力較弱,而Predicate由于包含邏輯詞and,ornegate(非)的運用,可以使判斷條件非常的豐富,條件判斷的擴展性比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)

    }


}

運行結(jié)果如下:

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源碼:

還有 31% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
支付 ¥3.00 繼續(xù)閱讀

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容