Lambda表达式

Lambda表达式也可称为闭包,允许把一个函数作为一个方法的参数(函数作为参数传递进方法中)
使用Lambda表达式可以把代码变得更加简洁紧凑。
lambda表达式的语法格式如下:
(parameters)->expression

(parameters)->{statements;}
以下lambda表达式的重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
// 1. 不需要参数,返回值为 5
() -> 5

// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x

// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y

// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

列:开启一个子线程写法如下:

new Thread(new Runnable() { @Override

public void run() {

// 处理具体的逻辑 }

}).start();

使用Lambda表达式则可以这样写:

new Thread(() -> {

// 处理具体的逻辑

}).start();

为什么能使用这么神奇的写法?因为Thread类的构造函数接收的参数是一个Runnable接口,并且该接口中只有一个待实现的方法。

查一下Runnable接口的源码:

public interface Runnable {

/**

* Starts executing the active part of the class’ code. This method is

* called when a thread is started that has been created with a class which * implements {@code Runnable}.

*/

public void run(); }

凡是这种只有一个待实现方法的接口,都可以使用Lambda表达式的写法。

比如说,通常创建一个类似于上述接口的匿名类实现需要这样写:

Runnable runnable = new Runnable() {

@Override

public void run() { // 添加具体的实现

} };

而有了Lambda表达式之后我们就可以这样写了:

Runnable runnable1 = () -> {

// 添加具体的实现 };

接下来我们尝试自定义一个接口,然后在使用Lambda表达式的方式进行实现。

新建一个MyListener接口,代码如下:

public interface MyListener {

String doSomething(String a, int b);

}

使用Lambda表达式创建MyListener接口的匿名实现写法如下:

MyListener listener = (String a, int b) -> {

String result = a + b;

return result;};

可以看倒,doSomething()方法的参数直接卸载括号里就可以了,而返回值仍然像往常一样,写在具体实现的最后一行即可,另外java还可以根据上下文自动推断出Lambda表达式中的参数类型,因此上面的代码也可以简化成:

MyListener listener = (String a, int b) -> {

String result = a + b;

return result;};

java将会自动推出参数a是Strings类型,参数b是int类型,从而使代码更加整洁:

public void hello(MyListener listener) { String a = “Hello Lambda”; int b = 1024;

String result = listener.doSomething(a, b);Log.d(“TAG”, result);

}

我们在调用hello()这个方法的时候就可以这样写:

hello((a,b) ->{

String result=a+b;

return result;

});

那么doSomething()方法就会将a和b两个参数进行相加,从而最终的打印结果就会是“Hello Lambda1024”。

传统情况下,我们给一个按钮设置点击事件需要这样写:

Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// 处理点击事件 }

});

使用Lambda表达式之后,就可以将代码简化成这个样子了:

Button button = (Button) findViewById(R.id.button); button.setOnClickListener((v) -> {

// 处理点击事件 });

另外当接口只有一个参数时,我们还可以进一步简化,

Button button = (Button) findViewById(R.id.button); button.setOnClickListener(v -> {

// 处理点击事件 });

--------《第一行代码》
---------《菜鸟教程》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值