最近从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))
}
}