IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> kotlin链式处理嵌套If else -> 正文阅读

[移动开发]kotlin链式处理嵌套If else

kotlin链式处理嵌套If else

kotlin文件

@file:Suppress("UNCHECKED_CAST", "RedundantVisibilityModifier")

package com.quanyou.xxxx

import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract

public class Result<out T> @PublishedApi internal constructor(
        override val isTrue: Boolean,
        @PublishedApi
        internal val value: T?
) : Result0(isTrue) {

    public inline fun invoke(action: (value: T?) -> Unit) {
        isInvoked = true
        action(value)
    }

    public fun isFalseOrNull(): Boolean {
        return !isInvoked && (value?.run { !isTrue } ?: false)
    }

    public companion object {
        @Suppress("INAPPLICABLE_JVM_NAME")
        @JvmName("failure")
        public fun <T> get(isTrue: Boolean, value: T?): Result<T> =
                Result(isTrue, value)
    }
}

@ExperimentalContracts
public inline fun <T> T?.ifElse(predicate: T.() -> Boolean): Result<T> {
    return Result.get(this?.run { predicate(this) } ?: false, this)
}

@ExperimentalContracts
public fun <T> T?.ifElse(predicate: Boolean): Result<T> {
    return Result.get(this?.run { predicate } ?: false, this)
}

/**
 * [action]代码块,如果在每一级判定条件中和[isTrue]或[isTrue2Next]成对出现,则当前判定条件值为[false]且扩展类[T]对象不为[null]时调用(如果当前判定已被处理则跳过);
 * 如果之前判定没有任何[isFalse]或[isFalseOrNull]处理,则此前任意一个判定条件为[false]且扩展类[T]对象不为[null]时调用。
 */
@ExperimentalContracts
public inline fun <T> Result<T>.isFalse(action: (value: T?) -> Unit): Result<T> {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    if (isFalse()) invoke(action)
    return this
}

/**
 * 如果此方法直接放[ifElse]之后,[action]代码块在[ifElse]判定条件值为[false]或扩展类[T]对象为[null]时调用。否则等同[isFalse]
 */
@ExperimentalContracts
public inline fun <T> Result<T>.isFalseOrNull(action: (value: T?) -> Unit): Result<T> {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    if (isFalseOrNull()) invoke(action)
    return this
}

/**
 * [action]代码块,当上一级判定条件值为[true]且扩展类[T]对象不为[null]时调用。如果上一级判定已被处理则跳过 。
 */
@ExperimentalContracts
public inline fun <T> Result<T>.isTrue(action: (value: T) -> Unit): Result<T> {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    value?.run {
        if (!isInvoked && isTrue) {
            isInvoked = true
            action(value)
        }
    }
    return this
}

/**
 * [action]代码块,当上一级判定条件值为[true]且[T]对象不为[null]时调用,返回下一级判定条件。如果上一级判定已被处理则跳过 。
 */
@ExperimentalContracts
public inline fun <T> Result<T>.isTrue2Next(action: (value: T) -> (Boolean)): Result<T> {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    return value?.let {
        if (!isInvoked && isTrue) value.ifElse {
            isInvoked = true
            action(value)
        } else this@isTrue2Next
    } ?: this
}

public open class Result0 internal constructor(
        open val isTrue: Boolean,
) {
    var isInvoked = false

    public inline fun invoke(action: () -> Unit) {
        isInvoked = true
        action()
    }

    public fun isFalse(): Boolean {
        return !(isInvoked || isTrue)
    }

    public companion object {
        @Suppress("INAPPLICABLE_JVM_NAME")
        @JvmName("failure")
        public fun get(isTrue: Boolean): Result0 =
                Result0(isTrue)
    }
}

@JvmName("ifElse")
public inline fun _ifElse(predicate: () -> Boolean): Result0 {
    return Result0.get(predicate())
}

public fun ifElse(predicate: Boolean): Result0 {
    return Result0.get(predicate)
}

/**
 * [action]代码块,如果在每一级判定条件中和[isTrue]或[isTrue2Next]成对出现,则当前判定条件值为[false]时调用(如果当前判定已被处理则跳过);
 * 如果之前判定没有任何[isFalse]处理,则此前任意一个判定条件为[false]时调用。
 */
@ExperimentalContracts
public inline fun Result0.isFalse(action: () -> Unit): Result0 {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    if (isFalse()) invoke(action)
    return this
}

/**
 * [action]代码块,当上一级判定条件值为[true]时调用。如果上一级判定已被处理则跳过 。
 */
@ExperimentalContracts
public inline fun Result0.isTrue(action: () -> Unit): Result0 {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }

    if (!isInvoked && isTrue) {
        isInvoked = true
        action()
    }
    return this
}

/**
 * [action]代码块,当上一级判定条件值为[true]时调用,返回下一级判定条件。如果上一级判定已被处理则跳过 。
 */
@ExperimentalContracts
public inline fun Result0.isTrue2Next(action: () -> (Boolean)): Result0 {
    contract {
        callsInPlace(action, InvocationKind.AT_MOST_ONCE)
    }
    return if (!isInvoked && isTrue) _ifElse {
        isInvoked = true
        action()
    } else this
}

示例

1、示例一

 this.ifElse {
            i >= 1//一级判定条件
        }.isFalseOrNull {e->
            log("1")
            //此代码块 当上一级判定条件(i >= 1) 值为false 或者 this(即e对象) == null时调用
        }.isTrue2Next { e ->
            //此代码块 当上一级判定条件(i >= 1) 值为true 且 this(即e对象) != null时调用
            log("2")
            i >= 2
        }.isFalse { e ->
            log("3")
            //此代码块 当上一级判定条件(i >= 2) 值为false时调用
        }.isTrue2Next { e ->
            //此代码块 当上一级判定条件(i >= 2) 值为true 且 this(即e对象) != null时调用 
            log("4")
            i >= 3
        }.isFalse { e->
            log("5")
            //此代码块 当上一级判定条件(i >= 3) 值为false时调用 
        }.isTrue { e ->
            log("6")
            //此代码块 当上一级判定条件(i >= 3) 值为true 且 this(即e对象) != null时调用 
        }.isFalse { e ->
            log("7")
           //此代码块 不会调用 因为上一级判定(i >= 3) 已被处理
        }.isTrue { e ->
            log("8")
            //此代码块 不会调用 因为上一级判定(i >= 3) 已被处理
        }

 _ifElse {
            i >= 1//一级判定条件
        }.isFalse {
            log("1")
            //此代码块 当上一级判定条件(i >= 1) 值为false 时调用
        }.isTrue2Next {
            //此代码块 当上一级判定条件(i >= 1) 值为true 时调用
            log("2")
            i >= 2
        }.isFalse {
            log("3")
            //此代码块 当上一级判定条件(i >= 2) 值为false时调用 
        }.isTrue2Next {
            //此代码块 当上一级判定条件(i >= 2) 值为true 时调用
            log("4")
            i >= 3
        }.isFalse {
            log("5")
            //此代码块 当上一级判定条件(i >= 3) 值为false时调用 
        }.isTrue {
            log("6")
            //此代码块 当上一级判定条件(i >= 3) 值为true 时调用 
        }.isFalse {
            log("7")
            //此代码块 不会调用 因为上一级判定(i >= 3) 已被处理
        }.isTrue {
            log("8")
            //此代码块 不会调用 因为上一级判定(i >= 3) 已被处理
        }

2、示例二

  this.ifElse {
            i >= 1//一级判定条件
        }.isTrue2Next { e ->
            //此代码块 当上一级判定条件(i >= 1) 值为true且this(即e对象) != null 时调用
            log("1")
            i >= 2
        }.isTrue2Next { e ->
            //此代码块 当上一级判定条件(i >= 2) 值为true 且this(即e对象) != null 时时调用
            log("2")
            i >= 3
        }.isTrue { e ->
            log("3")
            //此代码块 当上一级判定条件(i >= 3) 值为true且this(即e对象) != null 时 时调用
        }.isFalse { e ->
            log("4")//此代码块 此前判定条件(i >= 1/i >= 2/i >= 3)为false 时调用
        }

        _ifElse {
            i >= 1//一级判定条件
        }.isTrue2Next {
            //此代码块 当上一级判定条件(i >= 1) 值为true 时调用
            log("1")
            i >= 2
        }.isTrue2Next {
            //此代码块 当上一级判定条件(i >= 2) 值为true 时调用
            log("2")
            i >= 3
        }.isTrue {
            log("3")
            //此代码块 当上一级判定条件(i >= 3) 值为true 时调用
        }.isFalse {
            log("4") //此代码块 此前判定条件(i >= 1/i >= 2/i >= 3)为false 时调用
        }
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:13:18  更:2021-08-26 12:14:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/4 15:30:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码