Android MVP+Retrofit+dagger2+RxAndroid框架整合(2)----Lambda表达式

作者:hwj3747
转载请注明

目录

  • (1)配置篇
  • (2)Lambda表达式
  • (3)icepick篇
  • (4)butterknife篇
  • (5)MVP篇
  • (6)Retrofit篇
  • (7)Dagger2篇
  • (8)RxAndroid/RxJava篇

背景

在很多时候,我们会定义了一个接口(一般被称为回调接口),用户通过提供这个接口的实例来传入指定行为。比如Android的view的OnClickListener接口:

public interface OnClickListener {    
  void onClick(View v);
}

当我们要设置一个view,比如button的点击事件,我们需要这么做(这里并不需要专门定义一个类来实现OnClickListener接口,因为它只会在调用处被使用一次。用户一般会使用匿名类型把行为内联):

Button b=new Button(getBaseContext());
b.setOnClickListener(
new View.OnClickListener() {    
@Override  
  public void onClick(View v) {  
      ((Button)v).setText("button");   
}});

实际上,我们需要使用的代码只有((Button)v).setText("button");这一句而已,但是我们必须用5,6行的代码来实现这一个简单的功能,试想一下,如果要实现的功能更复杂的话,那我们的代码是不是会变得更加冗长,可读性会很差。在以前,这个问题是没办法解决的,但是java8新加入的lambda表达式可以很好的解决这个问题,让我们的代码变得更加简洁。

Lambda表达式

上面的代码我们可以用两行的lambda表达式来代替它:

Button b=new Button(getBaseContext());
b.setOnClickListener(v->((Button)v).setText("button"));

看的出来使用lambda,可以大大缩减我们的代码,剔除不需要的代码。

lambda表达式的语法由参数列表、箭头符号->和函数体组成。
函数体既可以是一个表达式,也可以是一个语句块。
表达式:表达式会被执行然后返回执行结果。
语句块:语句块中的语句会被依次执行,就像方法中的语句一样。return语句会把控制权交给匿名方法的调用者。

举个例子,以下的3个lambda表达式:

(x, y) -> x + y

() -> {
          int a;
          a=42;
          return a;}

(s) -> { System.out.println(s); }

lambda表达式会自动识别参数类型,如第一第三个表达式,会识别出分别为int和String类型,这个识别系统是根据这个匿名内部类的参数来的,例如上面的OnClickListener接口的onClick方法参数是view类型的,那么lambda表达式就可以识别出来下面的v->((Button)v).setText("button")这个v是view类型的。
对于上面的三个表达式,
第一个lambda表达式,接收x和y这两个整形参数并返回它们的和;
第二个lambda表达式不接收参数,因为语句块包含多个表达式,所以我们要指定返回的值为a;
第三个lambda表达式接收一个字符串并把它打印到控制台,不返回值。

实际上,lambda表达式还有一些其他的用法,但是在项目中最经常用到的还是用来代替匿名内部类,其他的一些用法我也用的不多,这里就不写了。

你可能感兴趣的:(Android MVP+Retrofit+dagger2+RxAndroid框架整合(2)----Lambda表达式)