otherwise相关知识
-
PHP扩展开发[基础]tar zxvf php-5.4.6.tar.gzcd php-5.4.6/ext/./ext_skel –extname=say_hellocd say_hellovim config.m4将“Otherwise use enable”下面三行的“dnl”去掉,改为:dnl Otherwise use enable:PHP_ARG_ENABLE(say_hello, whether to enable say_hello support,Make sure that the comment is aligned:[ --enable-say_hello Enable say_hello support])vim say_hello.c/* {{{ PHP_MINFO_FUNCTION*/PHP_MINFO_FUNCTION(say_hello){php_info_print_table_start();php_info_print_table_header(2, “say_hello supp
-
SSM:动态SQL简单介绍动态SQL 1.使用动态sql完成多条件查询 If:利用if实现简单的条件选择 Choose(when,otherwise):相当于java中的switch语句,通常与whenhe otherwise. Where:简化sql语句中的where语句的判断条件 Set:解决动态更新语句 Trim:可以灵活的祛除多余的关键字 Foreach:迭代一个集合,通常用于in条件 2.使用if +where实现多条件查询 (1).Trim属性: prefix:前缀 suffix:后缀 prefixOverrides:对于trim包含内容的首部进行指定 suffixOverrides:对于trim包含内容的尾部进行指定 (2)foreac
-
为 Kotlin 中的 Boolean 类扩展一套流式 API近日拜读了大佬 mikyou 一篇讲 Kotlin 中泛型的 文章,里面说到 Kotlin 中泛型应用场景的问题时提到了给 Boolean 扩展出一套流式 API 的点子,甚是精彩,举个栗子:(3 < 2).yes { toast("yes") }.otherwise { toast("otherwise") }当然上面的代码还体现不出来给 Boole
-
linuxbrew...............http://linuxbrew.sh/ Install Linuxbrew The installation script installs Linuxbrew to /home/linuxbrew/.linuxbrew if possible and in your home directory at ~/.linuxbrew otherwise. Paste at a Terminal prompt: sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)" You’re done! Try installing a package: brew install hello
otherwise相关课程
otherwise相关教程
- 4.3 Boolean 代码实现 通过观察上述 Boolean 扩展的使用,我们首先需要明确几点:我们知道 yes、otherwise 实际上就是两个函数,为什么能链式链接起来说明中间肯定有一个类似桥梁作用的中间类型作为函数的返回值类型;yes、otherwise 函数的作用域是带返回值的,例如上述例子它能直接返回字符串类型的数据;yes、oterwise 函数的都是一个 lamba 表达式,并且这个 lambda 表达式将最后表达式中的值返回;yes 函数是在 Boolean 类型调用,所以需要基于 Boolean 类型的实现扩展函数。那么根据以上得出几点特征基本可以把这个扩展的简单版本写出来了 (暂时不支持带返回值的)://作为中间类型,实现链式链接sealed class BooleanExt object Otherwise : BooleanExt()object TransferData : BooleanExt()fun Boolean.yes(block: () -> Unit): BooleanExt = when { this -> { block.invoke() TransferData//由于返回值是BooleanExt,所以此处也需要返回一个BooleanExt对象或其子类对象,故暂且定义TransferData object继承BooleanExt } else -> {//此处为else,那么需要链接起来,所以需要返回一个BooleanExt对象或其子类对象,故定义Otherwise object继承BooleanExt Otherwise }}//为了链接起otherwise方法操作所以需要写一个BooleanExt类的扩展fun BooleanExt.otherwise(block: () -> Unit) = when (this) { is Otherwise -> block.invoke()//判断此时子类,如果是Otherwise子类执行block else -> Unit//不是,则直接返回一个Unit即可}fun main(args: Array<String>) { val numberList: List<Int> = listOf(1, 2, 3) //使用定义好的扩展 (numberList.size == 3).yes { println("true") }.otherwise { println("false") }}上述的简单版基本上把扩展的架子搭出来但是呢,唯一没有实现返回值的功能,加上返回值的功能,这个最终版本的 Boolean 扩展就实现了。现在来改造一下原来的版本,要实现返回值那么 block 函数不能再返回 Unit 类型,应该要返回一个泛型类型,还有就是 TransferData 不能使用 object 对象表达式类型,因为需要利用构造器传入泛型类型的参数,所以 TransferData 用普通类替代就好了。关于是定义成协变、逆变还是不变型,我们可以借鉴上篇文章使用到流程选择图和对比表格将从基本结构形式、有无子类型化关系 (保留、反转)、有无型变点 (协变点 out、逆变点 in)、角色 (生产者输出、消费者输入)、类型形参存在的位置 (协变就是修饰只读属性和函数返回值类型;逆变就是修饰可变属性和函数形参类型)、表现特征 (只读、可写、可读可写) 等方面进行对比协变逆变不变基本结构Producer<out E>Consumer<in T>MutableList<T>子类型化关系保留子类型化关系反转子类型化关系无子类型化关系有无型变点协变点 out 逆变点 in 无型变点类型形参存在的位置修饰只读属性类型和函数返回值类型修饰可变属性类型和函数形参类型都可以,没有约束角色生产者输出为泛型形参类型消费者输入为泛型形参类型既是生产者也是消费者表现特征内部操作只读内部操作只写内部操作可读可写第一步:首先根据类型形参存在位置以及表现特征确定:sealed class BooleanExt<T>object Otherwise : BooleanExt<Any?>()class TransferData<T>(val data: T) : BooleanExt<T>()//val修饰datainline fun <T> Boolean.yes(block: () -> T): BooleanExt<T> = when {//T处于函数返回值位置 this -> { TransferData(block.invoke()) } else -> Otherwise//注意: 此处是编译不通过的}inline fun <T> BooleanExt<T>.otherwise(block: () -> T): T = when (this) {//T处于函数返回值位置 is Otherwise -> block() is TransferData -> this.data}通过以上代码我们可以基本确定是协变或者不变,第二步:判断是否存在子类型化关系:由于 yes 函数 else 分支返回的是 Otherwise 编译不通过,很明显此处不是不变的,因为上述代码就是按照不变方式来写的。所以基本确定就是协变。然后接着改,首先将 sealed class BooleanExt<T> 改为 sealed class BooleanExt<out T> 协变声明,然后发现 Otherwise 还是报错,为什么报错啊,报错原因是因为 yes 函数要求返回一个 BooleanExt<T> 类型,而此时返回 Otherwise 是个 BooleanExt<Any?>(),反证法,假如上述是合理,那么也就是 BooleanExt<Any?> 要替代 BooleanExt<T> 出现的地方,BooleanExt<Any?> 是 BooleanExt<T> 子类型,由于 BooleanExt<T> 协变的,保留子类型型化关系也就是 Any? 是 T 子类型,明显不对吧?我们都知道 Any? 是所有类型的超类型。所以原假设明显不成立,所以编译错误很正常,那么逆向思考下,我是不是只要把 Any? 位置用所有的类型的子类型 Nothing 来替换不就符合了吗,那么我们自然而然就想到 Nothing,在 Kotlin 中 Nothing 是所有类型的子类型。所以最终版本 Boolean 扩展代码如下sealed class BooleanExt<out T>//定义成协变object Otherwise : BooleanExt<Nothing>()//Nothing是所有类型的子类型,协变的类继承关系和泛型参数类型继承关系一致class TransferData<T>(val data: T) : BooleanExt<T>()//data只涉及到了只读的操作//声明成inline函数inline fun <T> Boolean.yes(block: () -> T): BooleanExt<T> = when { this -> { TransferData(block.invoke()) } else -> Otherwise}inline fun <T> BooleanExt<T>.otherwise(block: () -> T): T = when (this) { is Otherwise -> block() is TransferData -> this.data}
- 3. 实例 下面是一个融合了 choose 和 bind 标签的实例:<select id="selectUserByLikeName" resultType="com.imooc.mybatis.model.User"> SELECT * FROM imooc_user WHERE username LIKE <choose> <when test="_databaseId == 'mysql'"> CONCAT('%',#{username},'%') </when> <when test="_databaseId == 'postgre'"> '%' || #{username} || '%' </when> <otherwise> <bind name="usernameLike" value="'%' + username + '%'"/> #{usernameLike} </otherwise> </choose></select>通过 choose 标签来判断当前的数据库厂商,如果是 MySQL 数据库,则调用CONCAT函数来拼接 % 和 username,如果是 PostgreSQL 数据库,则使用操作符||来拼接,如果是其它类型的数据库,则直接通过 OGNL 表达式来绑定一个新的变量 usernameLike。在这个例子中,choose 是一个条件选择标签,第一个 when 相当于 if 判断,第二个 when 相当于 else if,最后的 otherwise 相当于 else。比起 if 标签,choose 标签无疑更为易用,适用于同一条件的多次判断逻辑。
- 3.3 项目代码结构 action 包主要定义插件中的两个 action,我们都知道在插件开发中 Action 是功能执行的入口,ImageSlimmingAction 是前面说到第一个功能点批量压缩指定输入和输出目录的,RightSelectedAction 是前面说过的第二个功能点在项目选中图中文件直接右键压缩的,最后这两个 Action 都需要在 plugin.xml 中注册。 <actions> <action class="com.imooc.plugins.image.slimming.action.ImageSlimmingAction" text="ImageSlimming" id="com.imooc.plugins.image.slimming.action.ImageSlimmingAction" description="compress picture plugin" icon="/img/icon_image_slimming.png"> <add-to-group group-id="MainToolBar" anchor="after" relative-to-action="Android.MainToolBarSdkGroup"/> </action> <action id="com.imooc.plugins.image.action.rightselectedaction" class="com.imooc.plugins.image.slimming.action.RightSelectedAction" text="Quick Slim Images" description="Quick Slim Images"> <add-to-group group-id="ProjectViewPopupMenu" anchor="after" relative-to-action="ReplaceInPath"/> </action> </actions>extension 包主要是定义了 Kotlin 中的扩展函数,一个是 Boolean 的扩展可以类似链式调用来替代 if-else 判断,另一个则是 Dialog 使用的扩展://Boolean 扩展sealed class BooleanExt<out T>object Otherwise : BooleanExt<Nothing>()//Nothing是所有类的子类,协变的类继承关系和泛型参数类型继承关系一致class TransferData<T>(val data: T) : BooleanExt<T>()inline fun <T> Boolean.yes(block: () -> T): BooleanExt<T> = when { this -> TransferData(block.invoke()) else -> Otherwise}inline fun <T> Boolean.no(block: () -> T): BooleanExt<T> = when { this -> Otherwise else -> TransferData(block.invoke())}inline fun <T> BooleanExt<T>.otherwise(block: () -> T): T = when (this) { is Otherwise -> block() is TransferData -> this.data}//Dialog扩展fun Dialog.showDialog(width: Int = 550, height: Int = 400, isInCenter: Boolean = true, isResizable: Boolean = false) { pack() this.isResizable = isResizable setSize(width, height) if (isInCenter) { setLocation(Toolkit.getDefaultToolkit().screenSize.width / 2 - width / 2, Toolkit.getDefaultToolkit().screenSize.height / 2 - height / 2) } isVisible = true}fun Project.showWarnDialog(icon: Icon = UIUtil.getWarningIcon(), title: String, msg: String, positiveText: String = "确定", negativeText: String = "取消", positiveAction: (() -> Unit)? = null, negativeAction: (() -> Unit)? = null) { Messages.showDialog(this, msg, title, arrayOf(positiveText, negativeText), 0, icon, object : DialogWrapper.DoNotAskOption.Adapter() { override fun rememberChoice(p0: Boolean, p1: Int) { if (p1 == 0) { positiveAction?.invoke() } else if (p1 == 1) { negativeAction?.invoke() } } })}helper 包主要是用文件 IO 操作,由于两个 Action 都存在图片压缩操作,为了复用就直接把图片压缩 API 调用的实现操作抽出封装在 ImageSlimmingHelper 中,ui 包主要就是 Swing 框架中一些界面 GUI 的实现和交互。
- 2. 实例 在注解中使用动态 SQL 其实十分简单,只需在动态 SQL 语句的外面包上一层script标签即可。如下:@Select({"<script>", "SELECT * FROM imooc_user", " WHERE", " <choose>", " <when test='id != null'>", " id = #{id}", " </when>", " <when test='username != null'>", " username = #{username}", " </when>", " <otherwise>", " 1 = 0", " </otherwise>", " </choose>", "</script>"})User selectUserByIdOrName(@Param("id") Integer id, @Param("username") String username);在 Select 注解中,我们没有直接写入 SQL,而是在最外层套上一个 script 标签,这里考虑到 SQL 语句的美观性,我们把语句分成了字符串数组来书写,MyBatis 会自动将其拼接成一个完整的语句。
- 4.1 例1. 多条件查询用户 请使用 MyBatis 完成对 imooc_user 表多条件查询用户的功能,如果 id 不为空则直接使用 id 查询用户,否则使用 username 查询用户,如果 username 也为空,则直接查询全部用户。分析:按照 MyBatis 的开发模式,需先在 UserMapper.xml 文件中添加多条件查询用户的 select 标签,然后在 UserMapper.java 中添加上对应的方法。步骤:首先,在 UserMapper.xml 中添加 select 标签,并在标签中写入 SQL,使用 choose 中的 when 标签来依次判断 id 和 username 是否为 null,若均为 null,则在 otherwise 中添加上一个永假的值。如下:<select id="selectUserByIdOrName" resultType="com.imooc.mybatis.model.User"> SELECT * FROM imooc_user WHERE <choose> <when test="id != null"> id = #{id} </when> <when test="username != null"> username = #{username} </when> <otherwise> 1 = 0 </otherwise> </choose></select>这里使用了1 = 0作为条件判断的永假值。然后在 UserMapper.java 中添加上对应的接口方法,方法接受 id 和 username 两个参数,都可为空。package com.imooc.mybatis.mapper;import org.apache.ibatis.annotations.Mapper;import com.imooc.mybatis.model.User;@Mapperpublic interface UserMapper { User selectUserByIdOrName(@Param("id") Integer id, @Param("username") String username);}结果:通过如下代码,我们运行 selectUserByIdOrName 这个方法。UserMapper userMapper = session.getMapper(UserMapper.class);User pedro = userMapper.selectUserByIdOrName(null, null);System.out.println(pedro);id 和 username 两个属性均为空,因此所执行的 SQL 为:SELECT * FROM imooc_user WHERE 1 = 0 成功后,结果为:null
- 4.1 为什么开发一个 Boolean 扩展 给出一个例子场景,判断一堆数集合中是否全是奇数,如果全是返回输出 "奇数集合",如果不是请输出 "不是奇数集合",首先问下大家是否写过一下类似下面代码://java版写法public void isOddList(){ int count = 0; for(int i = 0; i < numberList.size(); i++){ if(numberList[i] % 2 == 1){ count++; } } if(count == numberList.size()){ System.out.println("奇数集合"); return; } System.out.println("不是奇数集合");}//kotlin版写法fun isOddList() = println(if(numberList.filter{ it % 2 == 1}.count().equals(numberList.size)){"奇数集合"} else {"不是奇数集合"})//Boolean扩展版本写法fun isOddList() = println(numberList .filter{ it % 2 == 1 } .count() .equals(numberList.size) .yes{"奇数集合"} .otherwise{"不是奇数集合"})//有没有发现Boolean扩展这种链式调用更加丝滑对比发现,虽然 Kotlin 中的 if-else 表达式自带返回值的,但是 if-else 的结构会打断链式调用,但是如果使用 Boolean 扩展,完全可以使你的链式调用更加丝滑顺畅一路调用到底。
otherwise相关搜索
-
oauth
object
object c
objective
objective c
objective c基础教程
objective c教程
objectivec
office visio 2003
offsetof
offsetparent
offset函数
okhttp
on on
on time
onbeforeunload
onblur
onclick
oncontextmenu
online