Lambda表达式简单使用

1. 依赖添加

工程的build.gradle里面添加
classpath 'me.tatarka:gradle-retrolambda:3.2.5'

app模块的build.gradle里面添加
apply plugin:'me.tatarka.retrolambda'


compileOptions {
    sourceCompatibility 1.8
    targetCompatibility 1.8
}

2.简单使用

匿名内部类常规写法
Button id_btn = (Button) findViewById(R.id.id_btn);
    id_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.e("initListener","onClick");
        }
});

lambda表达式写法
id_btn.setOnClickListener( v -> Log.e("initListener","onClick"));

3.语法介绍

基本的形式
(参数) -> {表达式}
其中符号->是不变的

参数的变化情况:
  • 无参数
    () -> 表达式
  • 单一参数
    param -> 表达式(能自动推导参数类型,可省略()括号)
  • 非单一参数
    (param1,param2) -> 表达式(能自动推导参数类型)
    (int param1,int param2) -> 表达式(不能自动推导参数类型 需要在参数前面加参数类型)

    表达式的变化情况:

  • 空表达式
    param -> {}

  • 单行表达式
    param -> 表达式(可忽略{}括号,返回表达式也可以省略return)
  • 非单行表达式
    param -> {表达式1;表达式2;}(表达式可以是return语句)

自定义两个参数的点击事件

public interface onClickListener{
    void onClick(View view,int position);
}

private onClickListener onClickListener;

public void setOnClickListener(onClickListener onClickListener) {
    this.onClickListener = onClickListener;
}

lambda表达式写法
setOnClickListener((v,position) -> Log.e("自定义的Listener",position+""));

再比如说这个例子

List<Integer> list = new ArrayList<>();

//匿名内部类形式
Collections.sort(list, new Comparator<Integer>() {
       @Override
       public int compare(Integer a, Integer b) {
           return a-b;
       }
   });

//Lambda写法
Collections.sort(list, (a, b) -> a - b);

4. Functional Interface(函数式接口)

Comparator接口只有一个抽象方法需要实现,这样的接口在Java 8中称为函数式接口。在Java 8之后的源码中,这样的接口都会使用@FunctionalInterface这个注解去标注
函数式接口就是只能有一个抽象方法是不包括default标记的方法(有默认实现)和Object中已有的方法。

5. 返回值

Lambda表达式除了可以作为参数,也可以作为变量赋值
 View.OnClickListener clickListener = v -> Log.e("initListener", "onClick");
 id_btn.setOnClickListener(clickListener);

6. 变量作用域

a是常量 不能被修改 ambda表达式可以直接访问外部变量而不需要加final,但这个变量不能够修改
lambda表达式中的()中的参数名不能与外部变量同名
int a = 1;
id_btn.setOnClickListener(x -> Log.i("tag", String.valueOf(a)));

lambda表达式的this是代表对应的外部类,而不代表匿名内部类本身
匿名内部类的this就是代表该匿名内部类
id_btn.setOnClickListener( view -> Log.e("initData", this.toString()));

7.Method References(方法引用)

List<Integer> list = new ArrayList<>();

//Lambda基本表达式
Collections.sort(list, (a, b) -> a.compareTo(b));

//方法引用
Collections.sort(list, Integer::compareTo);

方法引用的基本形式就是:
类名::方法名

方法的()没什么意义,一般不写
  • 对象::实例方法
  • 类::静态方法
  • 类型对象::实例方法

    Integer::compareTo就属于类型对象::实例方法这种

8. Constructor References(构造方法引用)

表现形式
类名::new

创建一个接口
public interface onEmpty<T>{
   T isNull();
}

//判断是不是为null
private <T extends String>boolean isEmpty(onEmpty<T> viewEmpty){

    return viewEmpty != null && viewEmpty.isNull() == null;
}

//匿名内部类写法
isEmpty(new onEmpty<String>() {
    @Override
    public String isNull() {
        return new String();
    }
});

//lambda表达式原始写法
 isEmpty(() -> new String());

//lambda构造方法写法
isEmpty(String::new);
C++的lambda表达式是一种定义匿名函数对象的方法,它可以捕获作用域中的变量,并在需要时使用Lambda表达式通常用于需要函数对象的场合,如STL算法的回调函数等。其基本语法如下: ```cpp [外部变量捕获列表] (参数列表) mutable 异常规范 -> 返回类型 { // 函数体 } ``` 其中各部分含义如下: - 外部变量捕获列表:用于指定lambda表达式可以访问的作用域中的外部变量。可以是值捕获(`[=]`)或引用捕获(`[&]`)。 - 参数列表:定义lambda表达式的参数,与普通函数参数列表类似。 - mutable:表示可以修改通过值捕获的外部变量,因为默认情况下是const。 - 异常规范:定义lambda表达式是否会抛出异常。 - 返回类型:lambda表达式的返回类型,可以省略,编译器会自动推导。 下面是一个简单的例子: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; int a = 10; // 使用lambda表达式打印所有元素 std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; }); std::cout << std::endl; // 使用lambda表达式对每个元素加a的值 std::for_each(vec.begin(), vec.end(), [a](int& x) { x += a; }); // 再次打印修改后的元素 std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; }); std::cout << std::endl; return 0; } ``` 在这个例子中,第一个lambda表达式简单地打印出向量中的每个元素。第二个lambda表达式则捕获了变量`a`的值,并通过引用修改了向量`vec`中的每个元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值