有关Rxjava的收藏
前言
最近在学习RxJava,收藏几篇在掘金看到的基础文章。
关于RxJava最友好的文章
关于RxJava最友好的文章——背压
RxJava 2.0 全新来袭
这3篇文章个人觉得对于初学RxJava的人来说比较友好,文末还有相关的demo,可以拉下来看着学。
最近在学习RxJava,收藏几篇在掘金看到的基础文章。
关于RxJava最友好的文章
关于RxJava最友好的文章——背压
RxJava 2.0 全新来袭
这3篇文章个人觉得对于初学RxJava的人来说比较友好,文末还有相关的demo,可以拉下来看着学。
Kotlin中的类构造方法可以类似java中的编写:
class Rect{
var h:Float;
var w:Float;
constructor(h: Float,w: Float) {
this.h = h
this.w = w
}
}
上述定义了一个矩形类,里面有两个属性(长h、宽w)。constructor为其构造函数的声明关键字。这里要注意的是,在Kotlin中定义属性时需要给该属性赋初值,或者需要一个拥有该属性赋值的构造方法。 否则程序会出错。
也可以这样写:
class Rect(var h: Float,var w: Float){
}
这种写法可以既定义类的属性又声明了构造方法。
关于构造函数详细的写法可以参考:Kotlin中的构造函数
Kotlin中的继承声明为 class 子类名:父类名{}
class Square : Rect(){
}
这里有一个父类Rect,一个子类Square。需要注意的是,父类需要声明open关键字,才可以被子类继承。
open class Rect{
}
在方法的重写上,子类需要声明override关键字来声明此方法为重写父类的方法。相应的父类也需要在对应的方法中声明open关键字
open class Rect{
open fun S(){
}
}
class Square : Rect(){
override fun S(){
}
}
Kotlin的抽象类定义与java类似,接下来直接上代码:
abstract class Animal(var name: String){
abstract fun type();
}
class Dog(name: String):Animal(name){
override fun type() {
}
}
使用abstract关键字声明Animal类为一个抽象类,内含一个type的抽象方法。Dog类在继承它的时候自动重写此type方法,并需要加上override的关键字。
Kotlin的接口定义和继承与java写法大致,以下是子类继承了父类和一个接口的例子:
abstract class Animal(var name: String){
abstract fun type();
}
interface Ability{
fun shout();
}
class Dog(name: String):Animal(name),Ability{
override fun shout() {
}
override fun type() {
}
}
在java的多态中我们可以使用一个父类的对象通过instanceof关键字来判断其是否为某个子类的引用。而类似的在Kotlin里也可以使用is关键字来进行判断。
fun main(args: Array<String>) {
var a: Animal = Dog("Boby");
if(a is Dog){
println(a.name);
}
}
输出结果:
Boby
Kotlin可以使用by关键字实现代理模式,详情可见:kotlin 委托
Kotlin可以利用object关键字声明一个类为单例模式。
object SignalInstance{
}
我们可以试着定义两个变量都为SignalInstance的。
var b = SignalInstance;
var c = SignalInstance;
println(b == c);
输出结果:
true
Kotlin中通过enum class 关键字定义一个枚举型。如:
enum class NUMBER{
ONE,TWO,THREE,FOUR,FIVE
}
通过类名.属性的格式可以获取该属性:
println(NUMBER.ONE);
输出结果:
ONE
可通过ordinal关键字获取此属性在枚举中的位置:
println(NUMBER.ONE.ordinal);
输出结果:
0
sealed关键字可以定义一个印章类,印章类让一个类拥有了有限多个子类。印章类甚至可以理解为一个特殊的枚举类。印章类本身不能被实例化。
sealed class Option(var num1:Int,var num2:Int){
class add(num1: Int,num2: Int):Option(num1,num2){
fun add() = num1+num2;
}
class sub(num1: Int,num2: Int):Option(num1,num2){
fun sub() = num1-num2;
}
}
在main函数中定义如下变量会出错:
var x : Option = Option(1,1);
这是因为Option类为印章类,其本身不可被实例化。
以下是一段使用印章类的代码:
fun main(args: Array<String>) {
var a : Option = Option.Add(2,3);
var b : Option = Option.Sub(3,2);
var list = listOf<Option>(a,b);
for (o in list){
if(o is Option.add){
println(o.add());
}else if(o is Option.sub){
println(o.sub());
}
}
}
上述通过定义在Option的印章类中两个子类的对象,在通过调用其子类中的不通方法完成输出。
印章类可定义有限的子类,每个子类中都有其自定义的内容,这是与枚举相比的最大区别。
fun 函数名 (参数名 : 参数类型 ) : 返回值类型 (
函数体
)
注:返回值类型若无返回值则声明Unit或者忽略不写,相当于java中的void
编写一个简单的加法函数:
fun add(x:Int,y:Int):Int{
return x+y;
}
如果函数里只包含一行代码,我们可以使用简单写法。上述的加法函数作变形:
fun add(x:Int,y:Int):Int = x+y;
Kotlin还可以使用var来定义一个函数,譬如:
var i = {x:Int,y:Int -> x+y};
这样定义出来的函数,其函数名为i。调用如下:
var a = i(10,20);
除此之外还有另外一种写法:
var j:(Int,Int) -> Int = {x,y -> x+y};
这样定义出来的函数,函数名为j。和第1种的效果一样。
有时候我们在调用函数时,部分参数不需要设置,而是有一个默认值。譬如计算圆周长时的pi。这时我们就可以通过设置默认参数实现。
fun main(args: Array<String>) {
C(r=2.0f);
}
val PI = 3.14f;
fun C(pi:Float = PI,r:Float):Float{
return 2*pi*r;
}
我们定义了一个常量(val)PI,在声明函数C时在其参数中设置pi(半径)有一个默认值为PI。在调用时,则需要显示的声明所需要传递的参数值。如:C(r=2.0f); 就是表明我们传递过去的是半径r。这种情况叫做具名参数。
when表达式的用法类似与java中的switch表达式
fun main(args: Array<String>) {
log(1);
log(2);
log(3);
log(4);
log(5);
log(6);
}
fun log(logLevel: Int){
when(logLevel){
1 -> println(logLevel);
2 -> println(logLevel);
3 -> println(logLevel);
4 -> println(logLevel);
5 -> println(logLevel);
else -> println("else");
}
}
输出结果:
1
2
3
4
5
else
可以在Kotlin中定义一个区间,以下是先定义一个1到100的闭区间,然后通过循环计算出1到100之和的代码:
var nums = 1..100;
var sum = 0;
for(num in nums){
sum+=num;
}
println(sum);
注:这里插一个题外话,上述的for(num in nums)与java中的foreach循环相类似。
开闭区间的表示方法:
将集合倒叙api :nums.reversed();
获取集合总数:nums.count();
fun main(args: Array<String>) {
var nums = 1..10;
for(num in nums step 2){
println(num);
}
}
输出结果:
1
3
5
7
9
List和Map与java中的不同在于它们的创建写法,其余的api与java类似。有需要可查阅此处:常用集合的使用
var nums = listOf< String >(
"111",
"222",
"333",
"444");
var map = HashMap< String,String >();
map["one"]="a";
map["two"]="b";
注:对于map的取值只需要map[对应的key值],如:map["one"]
在Kotlin中我们可以使用${}这样一种格式在一个字符串中引用一个变量。用法有点类似于Spring框架中的el表达式(记得是这个叫法),或者一些前端框架里也有类似的用法。
fun main(args: Array<String>) {
println(sayHello("Cyber"));
}
fun sayHello(name:String):String{
return "您好!${name}";
}
注:这里${}能够引用的变量类型不仅仅适用于String,可适用其他的基本数据类型。除此之外,在它的里面还可以调用函数,通过函数的返回值进行输出
Kotlin与Java的字符串对比区别
kotlin:== 对应 java:equals
kotlin:=== 对应 java:==
注:在java中我们判断两个字符串是否相等,我们会用equal()的方法,但是在kotlin中我们用==来判断,如果想要判断两个字符串的地址值我们使用===来进行判断。
当然,在Kotlin中也可以调用equals方法去达到上述==的效果,其内部其实调用了java中的equals方法。
var str1:String = "aaa";
var str2:String = "Aaa";
println (str1.equals(str2,true));
注:第二个参数是设置是否忽略字母大小写的意思。
在调用函数时如果参数传递的是一个null值会报错。如:
fun main(args: Array<String>) {
println(sayHello(null));
}
fun sayHello(name:String):String{
return "您好!${name}";
}
这是由于Kotlin自带有空值判断的功能,如果此处代码默认参数可以为null可以这样写:
fun sayHello(name:String?):String{
return "您好!${name}";
}
在参数的类型旁加一个?代表此参数可以为null,输出结果为:
您好!null