Lambda表达式的生动理解以及Java Lambda表达式常见使用场景

Lambda表达式的生动理解以及Java Lambda表达式常见使用场景本篇承接上一篇JavaLambda表达式快速学习,对Lambda表达式的语法格式进行演化说明,并对Java中Lambda表达式的常见使用场景进行说明。Lambda表达式怎么来的?在Java中,给一个字符串变量赋值就很简单,类似:Stringstr=”HelloWorld.”;函数的赋值如果要把一个函数赋值给一个变量怎么办呢?类似一般的变量赋值, blockOfCode=publicvoidmethod(Strings){

大家好,欢迎来到IT知识分享网。Lambda表达式的生动理解以及Java

本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明。

Lambda 表达式怎么来的?

在Java 中, 给一个字符串变量赋值就很简单, 类似:
String str = "Hello World.";

  1. 函数的赋值
    如果要把一个函数赋值给一个变量怎么办呢?类似一般的变量赋值,
		blockOfCode = public void method(String s) {
			              System.out.println(s);
		              };
  1. 简化
    上面的代码看起来有点啰嗦, 通过以下几点进行简化:
  • public 多余,可以删除
  • 因为有变量名, 函数名也是多余, 可以删除
  • 返回类型由编译器自己判断, 可以删除
  • 参数类型也可以删除

通过简化,代码后:

blockOfCode   = (s){
                               System.out.println(s);
                      }
  1. 进一步简化和改善
    使用下面两点对上面的代码进一步简化和改善:
  • 如果只有一行, 省略大括号
  • 使用箭头符号连接参数和函数

改善后的代码如下:

blockOfCode   = (s) -> System.out.println(s);

这个代码是不是就很接近Lambda 表达式了?

Lambda 表达式的类型?

类似 (s) -> System.out.println(s) 的Lamba 表达式究竟是什么呢?
可以这样简单理解

  • Lamba 类型是一个接口
  • Lamba 表达式本身是一个接口的实现。

有个问题是: Lamba 表达式实现了一个接口方法, 如果这个接口定义了多个方法呢?
在Java中, 只有一个接口函数需要被实现的接口类型, 称做 “函数式接口”
为了避免在接口中增加接口函数, 变成非函数接口,Java提供了一个注解@FunctionalInterface , 注解该注解后, 就无法在该接口添加接口函数了。

Java Lambda表达式的使用场景

在Java中, Lambda 的使用场景有很多, 这里列举几种常见的使用场景。

1. 按钮事件处理

曾经C/S 模式流行的时候, Java的界面开发工具包(类似AWT、Swing、SWT等)很受欢迎, 在界面开发的时候,给一个组件(比如按钮)添加事件监听器的代码类似:

	@Test
	public void btnListener() {
		JButton btn = new JButton();

		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("btnListener: without lambda expression");
			}
		});
		

	}
  • ActionListener 是一个接口, 该接口定义了一个方法actionPerformed()。
  • new ActionListener() { actionPerformed 方法实现} 语法用于定义一个匿名类并返回该类的实例。

因为ActionListener 接口只有一个需要实现的接口方法,所以可以使用Lambda表达式替代,代码如下:


		btn.addActionListener((e) -> {System.out.println("btnListener: use lambda expression");});

完整示例:https://gitee.com/xuemingchen/java-ency/blob/master/src/main/java/com/osxm/je/base/lambda/AwtBtnListenerLambdaDemo.java

2.  实现Runnable 接口的线程

在Java中,创建一个线程可以使用 new Thread(Runnable target) , 该构造函数的参数是一个继承Runnable接口的匿名类实例, 该类实现接口的run() 方法, 代码如下:

		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("runnable:without lambda expression");
			}
		}).start();

使用Lambda 表达式之后, 以上代码可以简化为:

new Thread(() -> System.out.println("runnable:use lambda expression")).start();

完整示例:https://gitee.com/xuemingchen/java-ency/blob/master/src/main/java/com/osxm/je/base/lambda/RunnableLambdaDemo.java

3. 列表(List)的遍历

在Java中, 对一个数组循环遍历的方式有很多种,比如有这样一个字符串数组:
List<String> list = Arrays.asList("str1","str2","str3");
对于早期的Java初学者最常用的方式是:

		for(int i=0;i<list.size();i++) {
			System.out.println("listIterator: without lambda expression"+list.get(i));
		}

在Java新特性之后, 代码可以稍加简化:

		for(String str:list) {
			System.out.println("listIterator: without lambda expression"+str);
		}

如果使用Lambda 表达式, 则代码可以进一步简化:

list.forEach(str->System.out.println("listIterator: use lambda expression"+str));

完整示例:https://gitee.com/xuemingchen/java-ency/blob/master/src/main/java/com/osxm/je/base/lambda/ListIteratorDemo.java



免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22063.html

(0)
上一篇 2024-01-12 07:00
下一篇 2024-01-12 09:15

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信