声明对象时(包括方法的参数): 把"?"跟在类名后面,表示这个对象允许为null; 把"!!"跟在类名后面,表示这个对象不允许为null; 2. 调用对象时: 把"?"...参数str可以传null fun heat(str: String?)...size > 0) { Log.d("TAG", "-->> 房间数不是0") } 编译器会告诉我们:当roomList为null的时,它的size返回就是"null",但是"null...= null)这种Java常见语句才能避免异常吗? 不过Kotlin不会让程序出现这种啰嗦的代码,所以里面提供了对象A ?: 对象B表达式, ?...需要显示的将可变参数通过 * 展开,然后传递给 asList 函数。
函数参数可以有默认值,当省略相应的参数时使用默认值。...当覆盖一个带有默认参数值的方法时,签名中不带默认参数值: open class DefaultParamBase { open fun add(x: Int = 0, y: Int = 0):...当一个函数有大量的参数或默认参数时这会非常方便。...reformat(str) 然而,当使用非默认参数调用它时,该调用看起来就像 reformat(str, true, true, false, '_') 使用命名参数我们可以使代码更具有可读性 reformat...{ ..... } 8.2.6 单表达式函数 当函数返回单个表达式时,可以省略花括号并且在 = 符号之后指定代码体即可 fun double(x: Int): Int = x * 2 当返回值类型可由编译器推断时
之前和大家介绍过在C/C++中嵌入Python,本次和大家分享下使用C/C++扩展Python内置模块的方法。...向extend.cpp模块文件中添加C函数,该函数在执行libpy3extend.extend_add(1,99) 时被调用。C函数总是有两个参数,通常命名为self和args。...static PyMethodDef extendMethods[] = { //extend add {"extend_add", extend_add, METH_VARARGS,...NULL}, {"extend_str", extend_str, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; METH_VARARGS表示该函数希望参数传递为元组数据以使用...将刚才定义的结构传递给模块初始化函数中的解释器。 注意:必须命名初始化函数PyInit_name(),其中name是模块的名称。
J2SE 1.5提供了“Varargs”机制。借助这一机制,可以定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。...这种做法可以有效的达到“让方法可以接受个数可变的参数”的目的,只是调用时的形式不够简单。 J2SE 1.5中提供了Varargs机制,允许直接定义能和多个实参相匹配的形参。...尽管在背地里,编译器会把能匹配不确定个实参的形参,转化为数组形参;而且也可以用数组包了实参,再传递给实参个数可变的方法;但是,这并不表示“能匹配不确定个实参的形参”和“数组形参”完全没有差异。...如果把一个能和不确定个实参相匹配的形参的类型,用一个标识符来代表,那么编译器会给出一个“generic array creation”的错误。 清单11:当Varargs遇上泛型 ?...在引入Varargs机制之后,这一原则仍然适用,只是要考虑的问题丰富了一些——传统上,一个重载方法的各个版本之中,只有形参数量与实参数量正 好一致的那些有被进一步考虑的资格。
后面的 &arg1, &arg2 就是通过参数解析提取的值,存放的地方,这有点类似 C 的 scanf; 很明显,这三个参数,在数量上存在这一定的联系,也就是,传进去两个 int参数,那么就肯定是对应了两个...(METH_VARARGS), 还是其他等等; 第四个字段:方法描述,就是通过 help() 或者 doc 可以看到的; 需要注意的是,这个列表的最后必须以 {NULL, NULL, 0, NULL}...*/ }; 正因为存在这样的一份记录表,Python 才能够寻找到相应的函数 同样的,如果我们想要找一个模块的 Python 函数 对应什么的 C模块方法,也能通过这地方比较粗暴得知,例如 Python...这个函数名不能像上面那样,这是有规定的,必须是 init + 模块名字,比方说,我的最后编译出来的文件是 test.so, 那我的函数名就是 inittest, 这样在 Python 导入 test 模块时,...所以,在我们编写 C扩展 时,也需要时刻谨记这步. 主要会用到下面两个宏: 1. 增加引用: Py_INCREF 例: Py_INCREF(pObj1) 2.
可变参数Varargs介绍 在JDK 1.5之前,要想在方法中使用可变参数,则必须通过数组(或其它集合)来实现,在这种情况下你需要将变量显式的定义在数组中,在使用时要从数组中取出变量。...而在JDK 1.5中,引入了可变参数(Varargs),全称为variable number of arguments,常被称为variable arguments。...使用可变参数的注意事项 可变参数只有当参数数目不确定时才会使用。 当参数中需要T[]作为参数时,可以考虑使用可变参数。 可变参数只能用在参数列表中的最后一个位置,且方法中只能有一个可变参数。...尽量避免重载含有可变参数的方法。 可变参数输入时不能传null值。 Arrays.asList()方法支持可变参数。...参考资料: 1、Effective Java 2.0 2、http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html 3、http
4、子类的初始化过程如果发现其父类还没有进行过初始化 5、使用反射API 进行反射调用时 6、第一次调用java.lang.invoke.MethodHandle实例时 这种我不管你用不用,只要我这个类初始化了...如此一整,这种方法就完美了...吗?好像也有缺点啊,比如我调用getSingleton方法创建实例的时候想传入参数怎么办呢?...如果不用动态传参数,那么这个方法已经足够了。 可以传参的单例 —— 懒汉 如果需要传参数呢?...等等,new Singleton()这个实例化过程真的没问题吗?...private volatile static Singleton singleton; kotlin 版本双重校验 //不带参数 class Singleton private constructor
可以自动识别Java中的getter/setter函数,而在Java中可以过getter/setter操作Kotlin属性。...当把平台值传递给期待非空值等的Kotlin函数时,也会触发一个断言。总的来说,编译器尽力阻止空值的传播(由于泛型的原因,有时这不可能完全消除)。...Java 类有时声明一个具有可变数量参数(varargs)的方法来使用索引。...型变的泛型 当 Kotlin 的类使用了声明处型变时,可以通过两种方式从Java代码中看到它们的用法。...extends Base> box) { …… } 注意:当参数类型是 final 时,生成通配符通常没有意义,所以无论在什么地方 Box 始终转换为 Box。
: 参数顺序调换,参数就传错了,不好维护。...当参数是一堆数字,很难知道数字对应的形参,可读性不高。...,当我们调用时,有些有默认值的参数就可以不传参,Kotlin编译器自动帮我们填上默认值。...因此,可以将函数引用传递给其他函数,并在需要时执行。...} 图片 普通函数,参数是函数式接口对象,传 函数类型对象 也是可以的 反过来不可以: 高阶函数, 参数是函数类型对象,传 是函数式接口对象 是不可以的。 前面说的都是函数传不同的参数类型。
例如,当一个 lambda 作为构造函数参数传递给一个对象时,后者可以用于引用另一个必须稍后定义的对象: lateinit修饰符现在可以用在顶级属性和局部变量上。...例如,当作为构造函数参数传递给一个对象的 lambda 引用另一个对象时,稍后必须定义的对象可以使用: ? 循环中的值:1, 2, 3, 1, 2, 3, 1, ......改进 smart cast 当一个变量从一个安全调用表达式中被赋值并且被检查为 null 时,smart cast 也被应用到安全调用接收器中: ?...不幸的是,当构造函数调用的参数中存在这样的表达式时,一些字节码处理工具不能很好地处理这些代码。...时并不会)。 要返回到 1.2 之前的行为,请将 -Xno-exception-on-explicit-equals-for-boxed-null 标志传递给编译器。
规定,当Lambda参数是函数最后一个参数时,可以移动到括号外面: val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }...} 当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用 it 关键字来代替: val maxLengthFruit = list.maxBy { it.length } map...有着严格的空指针检查,它在编译时就会检查代码是否安全(会不会出现null),这当然会导致代码变得比较男鞋,但是Kotlin也提供了一系列辅助工具。...默认所有的参数和变量都是不可为空的,所有传入的study也不可能为空,当传入null时,会提示错误。...操作符,这个操作符的作用非常好理解,就是当对象不为空时正常调用相应的方法,当对象为空时则什么都不做。如: //简化前 if (a !
听说……Kotlin 可以用 Lambda? ? 不错不错,Java 8 也有 Lambda,挺好用的。 听说……Kotlin 的 Lambda 还能当函数参数? ? 啊挺好挺好,我也来写一个! ?...而在 Kotlin 里面,函数的参数也可以是函数类型的: fun a(funParam: Fun): String { return funParam(1); } 当一个函数含有函数类型的参数的时候...但是只有这样写,调用的人才知道应该传一个怎样的函数类型的参数给你。...这个知识能帮你解开 Kotlin 的高阶函数以及接下来我马上要讲的匿名函数、Lambda 相关的大部分迷惑。...,但你照着同样的写法写一个 Kotlin 的接口,你却不能传 Lambda。
如果我们不想看到这样的异常,而是当name是null的时候,安静的输出null,直接使用Kotlin中的空安全的调用 .? : name?....当将 Java 类型导入 Kotlin 时,我们会执行一些转换: Kotlin 的泛型 Java 的泛型 说明 Foo! Foo<?...Java 可变参数 Java 类有时声明一个具有可变数量参数(varargs)的方法来使用索引。...中,要某个函数做某件事时,会传一个函数参数给它。...而在Java中,并不支持传送函数参数。通常Java的实现方式是将动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法。
前言 如果你对移动端有所关注,那么你一定会听说过Flutter。得益于Google,Flutter一经推出便得受到了广泛关注。...由示例代码可以看到,我们将传进来的参数重新组装成了Map并传递给了invokeMethod。...其中invokeMethod函数第一个参数为函数名称,即registerApp,我们将在原生平台用到这个名字。第二个参数为要传递给原生的数据。...,当然也可以选择不传。...如果Flutter传来的String是null,那么在oc中对应的是NSNull,但微信SDK的参数可以为nil,却不能为NSNull。
Kotlin 程序是什么样子的?如果浏览过本书,你会看到许多例子。很有可能你觉得 Kotlin 语言有点古怪,充满了var field: String这样的语法。...is String){ } // 代码块外部的obj仍然是Any类型的引用 return null } 2.2.4 空值检测 Kotlin 是空指针安全的,也就意味着你不会再看到那恼人的空指针异常...size),只会在files不为空时执行。 以及,你可以这样写 //当data不为空的时候,执行语句块 data?....let{ //... } //相反的,以下代码当data为空时才会执行 data?...2.3.5 将函数作为参数 Kotlin 中,可以将一个函数作为参数传递给另一个函数 fun lock(lock: Lock, body: () -> T ) : T { lock.lock
某一时刻当一个线程刚刚运行完 if 语句的时候有可能被挂起,而与此同时另外一个线程调用该方法并且创建单例。而之前被挂起的线程会继续运行,并创建另外一个实例。 <!...上述内容就会导致大量的模板代码,每次当您创建单例时就需要重复它们。对于这么一个简单的任务却使用了如此繁杂的代码,所以 Java 中创建单例时通常会使用 枚举。...当您将 Java 的单例代码转换为 Kotlin 代码时,所有的静态属性和方法就会被移动到 companion object 中。
kotlin来了,就因为Google背书了一哈,你们就无条件的沸腾了。 这年头出来了所谓语言还少吗? 三天两头搞些新花样。 你们就不能安心的团结在java或者其他世界最好语言的周围长期演进吗?...kotlin有个特点就是梭梭就是干。前缀是啥就是啥,前缀是val表示变量,前缀是vararg那么很明显就是可变参数。...,当你搞不清楚接下来要写什么时,请你想到冒号。...=null, var last: String?=null, @Id var id:String?...这个很明显是传默认值的。就这么简单粗暴。 至于其他的if else for 等等基本语法,相信你通过cv大法搞一次基本就可以熟练使用了。这年头,你写的各种语言的helloworld还少吗。
例如,当一个 lambda 作为构造函数参数传递给一个对象时,后者可以用于引用另一个必须稍后定义的对象: lateinit修饰符现在可以用在顶级属性和局部变量上。...例如,当作为构造函数参数传递给一个对象的 lambda 引用另一个对象时,稍后必须定义的对象可以使用: 循环中的值:1, 2, 3, 1, 2, 3, 1, ......弃用:数据类的覆写性拷贝 当从已经具有相同签名的拷贝函数的类型派生数据类时,为数据类生成的 copy 实现使用父类型的默认函数,会导致出现与预期相反的行为,如果父类型没有默认参数,则在运行时失败 导致复制冲突的继承已经被...不幸的是,当构造函数调用的参数中存在这样的表达式时,一些字节码处理工具不能很好地处理这些代码。...时并不会)。 要返回到 1.2 之前的行为,请将 -Xno-exception-on-explicit-equals-for-boxed-null 标志传递给编译器。
5.1.3 kotlin 方法自动传参 Kotlin 可以在 构造方法或者相关函数大括号里面设置默认参数,这样传参就可以使用默认参数了,我们具体看看怎么使用的吧~ ?...第二个参数可以省略,此时会使用默认值 ? ? 不省略时跟 Java 无异 ?...5.1.4 kotlin named argument named argument 的中文含义是 可以根据 参数名 进行传递参数,传参顺序不需要严格按照函数定义顺序,这样就可以避免参数误传的问题了 ?...: 作用是当数据非空时,直接返回数据,而当数据为空时,返回合并到的数据。利用该运算符,可以很容易的把可空类型转换为非空类型,详细代码如下: if(foo!...,它可以在失败时返回 null,详细代码如下: foo as?
领取专属 10元无门槛券
手把手带您无忧上云