使用 Lambda 取代 Android 中的匿名类

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

Lambda

Lambda是第十一个希腊字母,大写Λ,小写λ,额,跑题了…Lambda表达式 是Java8的新特性之一:

  1. Lambda表达式
  2. 函数式接口
  3. 流API
  4. 默认方法
  5. 新的Date
  6. Time API

Lambda表达式 取代了匿名类 ,取消了模板,允许用函数式风格编写代码。

由于最近接触了RxJava,遇到了Lambda,立马就喜欢上了~所以就学习了一下.

本文主要介绍一下Lambda在Android中替代匿名类的部分使用场景.

在Android中使用Lambda

gradle-retrolambda

A gradle plugin for getting java lambda support in java 6, 7 and android

在Android中使用我们需要使用这个插件,按照配置配置完就行.

实战使用

由于Lambda 可以取代匿名类,所以我们先来挑几个匿名类练练手.

这里先简单的提及一下Lambda的语法:() -> {}咋一看可能觉得这个什么鬼啊?看不懂啊!

不急,看几个例子先~

设置监听事件

Android中我们设置监听一般这么写:

mFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                doSomething();
            }
        });

这么写AS会提示说匿名类new View.OnClickListener()能被Lambda代替:

使用 Lambda 在 Android 中的替代匿名类
提示

那么用Lambda可以如何写呢?

mFab.setOnClickListener(v->doSomething());

看到了么?

整个匿名内部类被v->doSomething()给代替了.

是不是非常简单?

Ps: 本例子中的`v`代表onClick传递的参数v,参数不能省略,但是可以随意命名.
实现Runnable

在Android中我们起个线程一般这么写:

new Thread(new Runnable() {
            @Override
            public void run() {
                doSomething();
            }
        }).start();

而使用Lambda表达式的话可以这么写:

new Thread(() -> doSomething()).start();

另外实例化Runnable成员变量也可以这么写:

Runnable runnable = ()->doSomething();

看完这两个例子是否对Lambda感兴趣了呢?后续我还会继续学习,有兴趣的请继续关注~


.................... 【.........阅读全文】

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java


### Java Lambda表达式简化匿名内部类的前提条件 要理解如何使用Lambda表达式简化匿名内部类,需满足以下几个前提条件: #### 1. 函数式接口的存在 Lambda表达式的本质是对函数式接口的实现。因此,只有当目标是一个函数式接口,才能通过Lambda表达式替代匿名内部类[^3]。 函数式接口是指仅包含一个抽象方法的接口,例如`Runnable`、`Callable`或自定义的单方法接口。 ```java @FunctionalInterface interface Greeting { void sayHello(String message); } ``` #### 2. 匿名内部类的功能单一 如果匿名内部类只实现了某个函数式接口的一个方法,则可以被替换为Lambda表达式。这是因为Lambda表达式的设计初衷就是为了减少这种场景下的冗余代码[^4]。 #### 3. 方法签名匹配 Lambda表达式的参数列表和返回值类型必须与目标函数式接口的方法签名完全一致。这意味着,在转换过程中,无需显式声明类型推断即可完成映射[^1]。 ```java // 使用匿名内部类的方式 Greeting greeting = new Greeting() { @Override public void sayHello(String message) { System.out.println(message); } }; greeting.sayHello("你好"); // 使用Lambda表达式的方式 Greeting lambdaGreeting = (message) -> System.out.println(message); lambdaGreeting.sayHello("你好"); ``` #### 4. 上下文中存在清晰的目标类型 编译器需要能够从上下文中推导出Lambda表达式的具体目标类型(即哪个函数式接口)。这通常发生在变量赋值、方法调用或作为泛型类型的参数传递[^2]。 ```java public void execute(Runnable task) { task.run(); } execute(() -> System.out.println("执行任务")); // 编译器自动识别 Runnable 类型 ``` #### 5. 不支持多重继承冲突 由于Java中的方法重载机制以及可能存在的默认方法,某些情况下可能会导致歧义。此无法直接应用Lambda表达式,仍需依赖传统匿名内部类或其他解决方案。 --- ### 总结 综上所述,使用Lambda表达式简化匿名内部类的核心前提是目标接口必须是函数式接口,并且其唯一抽象方法的签名字面量应能被准确解析出来。此外,还需注意实际开发环境中的兼容性和局限性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值