您的当前位置:首页正文

kotlin中三元运算符

来源:花图问答

最近从java转移到kotlin,效率提升了不少,但java中用的三元操作就没有了。
于是山寨一套kotlin版本的三元操作符,代码如下 :

/**
 * @author      WangXM
 * @version     create:2018/5/23
 */

/**
 * if [T] is null run [nullTerm] else [term]
 */
fun <T, R> T?.forObj(term:(t:T)->R, nullTerm:()->R): R {
    return this.let{
        if(null == it) nullTerm()  else term(it!!)
    }
}

/**
 * if [T] is null return [nullObj] else [obj]
 */
fun <T, R> T?.forObj(obj:R, nullObj:R): R {
    return this.let{
        if(null == it) nullObj  else obj
    }
}

/**
 * if term is true run [trueTerm] else [falseTerm]
 */
fun <R> (()-> Boolean).doJudge(trueTerm:()->R, falseTerm:()->R): R {
    return if(this())  trueTerm()   else falseTerm()
}

/**
 * if true run [trueTerm] else [falseTerm]
 */
fun <R> Boolean.doJudge(trueTerm:()->R, falseTerm:()->R): R {
    return if(this)  trueTerm()   else falseTerm()
}

/**
 * if true return [trueObj] else [falseObj]
 */
fun <R> Boolean.doJudge(trueObj:R, falseObj:R): R {
    return if(this)  trueObj   else falseObj
}

下面是单元测试:

import junit.framework.Assert
import org.junit.Test
import wxm.androidutil.util.doJudge
import wxm.androidutil.util.forObj

/**
 * @author      WangXM
 * @version     create:2018/5/23
 */
class EasyOperatorUT   {
    @Test
    fun testDoJude()   {
        Assert.assertTrue({1 == 1}.doJudge({true}, {false}))
        Assert.assertFalse({1 == 2}.doJudge({true}, {false}))

        Assert.assertTrue(true.doJudge({true}, {false}))
        Assert.assertFalse(false.doJudge({true}, {false}))

        Assert.assertTrue(true.doJudge(true, false))
        Assert.assertFalse(false.doJudge(true, false))
    }

    @Test
    fun testDoForObj()   {
        Assert.assertEquals("abc", "abc".forObj({t -> t}, {"false"}))
        Assert.assertEquals(1, 1.forObj({t -> t}, {0}))
        Assert.assertEquals(0, null.forObj({t -> t}, {0}))

        Assert.assertEquals("abc", "abc".forObj("abc", "false"))
        Assert.assertEquals(1, 1.forObj(1, 0))
        Assert.assertEquals(0, null.forObj(1, 0))
    }
}