java8 Lambda表达式的使用总结

Lambda表达式的使用总结

简介:
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁,更灵活的代码。

案例:
话不多说,直接先看例子:

语法格式一:无参,无返回值

首先我们先在单元测试内写出我们的原始代码:
定义一个Run接口,里面只有一running(无参)方法

interface Run{
    
    
	void running();
}

给出初始单元测试,实现Run接口的匿名实现类

	@Test
	public void test01() {
    
    
		Run runner=new Run() {
    
    
			@Override
			public void running() {
    
    
				System.out.println("人类会跑步");
			}
		};
		runner.running();
	}

下面便是lambda表达式的使用(打印结果皆是一致):
使用lambda表达式时可写成:

@Test
	public void test02() {
    
    
		Run runner=()->System.out.println("人类会跑步");
		runner.running();
	}

语法格式二:有一参,无返回值

首先是接口:

interface Run{
    
    
	void running(String name);
}

匿名实现类:

@Test
	public void test07() {
    
    
		Run runner=new Run() {
    
    
			@Override
			public void running(String name) {
    
    
				System.out.println(name+"能跑步");
			}
		};
		runner.running("小邱");
	}

lambda表达式:

@Test
	public void test08() {
    
    
		Run runner=(String name)->System.out.println(name+"能跑步");
		runner.running("小邱");
	}

还可直接将数据类型省略,因为可以由编译器推断得出,称为“类型推断”

@Test
	public void test08() {
    
    
		Run runner=(name)->System.out.println(name+"能跑步");
		runner.running("小邱");
	}

只有一个参数时,可省略小括号:

@Test
	public void test09() {
    
    
		Run runner=name->System.out.println(name+"能跑步");
		runner.running("小邱");
	}

语法格式三:有两参,无返回值

还是那个接口,在其方法中加入两个参数

interface Run{
    
    
	void running(String name,int distance);
}

其原匿名实现类:

@Test
	public void test01() {
    
    
		Run runner=new Run() {
    
    
			@Override
			public void running(String name,int distance) {
    
    
				System.out.println(name+"能跑"+distance+"公里");
			}
		};
		runner.running("小邱",100);
	}

使用lambda表达式:

@Test
	public void test06() {
    
    
		Run runner=(String name,int distance)->System.out.println(name+"能跑"+distance+"公里");
		runner.running("小邱",100);
	}

还可直接将数据类型省略,因为可以由编译器推断得出,称为“类型推断”

@Test
	public void test02() {
    
    
		Run runner=(name,distance)->System.out.println(name+"能跑"+distance+"公里");
		runner.running("小邱",100);
	}

格式四:有两参,有返回值

这里我们使用java中的Comparator接口来作为例子:
比较传入的两个数的大小

@Test
	public void test03() {
    
    
		Comparator<Integer> com1=new Comparator<Integer>() {
    
    
			@Override
			public int compare(Integer o1, Integer o2) {
    
    
				return Integer.compare(o1, o2);
			}
		};
		int compare1=com1.compare(10, 20);
		System.out.println(compare1);
	}

按照格式二中的写法便可以写成:

@Test
	public void test04() {
    
    
		Comparator<Integer> com1=(o1,o2)->Integer.compare(o1, o2);
		int compare1=com1.compare(10, 20);
		System.out.println(compare1);
	}

如果用方法引用(调用类中静态方法)的话就可以写成:

@Test
	public void test05() {
    
    
		Comparator<Integer> com1=Integer::compare;
		int compare1=com1.compare(10, 20);
		System.out.println(compare1);
	}

格式五:多参,多条语句

匿名实现类:

@Test
	public void test07() {
    
    
		Comparator<Integer> com1=new Comparator<Integer>() {
    
    
			@Override
			public int compare(Integer o1, Integer o2) {
    
    
				System.out.println(o1);
				System.out.println(o2);
				return o1.compareTo(o2);
			}
		};
	}

lambda表达式:

@Test
	public void test08() {
    
    
		Comparator<Integer> com1=(o1,o2)->{
    
    
			System.out.println(o1);
			System.out.println(o2);
			return o1.compareTo(o2);
		};
	}

总结:

1)举例:(o1,o2)->Integer.compare(o1,o2);
2)格式:
“->”:lambda操作符 或 箭头操作符
"->"左边:lambda形参列表(就是接口中的抽象方法的形参列表)
"->"右边:lambda体(就是重写的抽象方法的方法体)

3)
->左边:lambda形参列表的参数类型可以省略(类型推断):如果lambda形参列表只有一个参数,其小括号也可以省略。
->右边:lambda体应该由一对{}包裹,如果lambda题只有一条执行语句,那么可以省略{}
4)lambda的本质:作为接口的实例。

猜你喜欢

转载自blog.csdn.net/qq_45273552/article/details/109296786
今日推荐