java基础之Java8新特性-Lambda

发布时间:2024年01月05日

目录

什么是Lambda表达式

Lambda表达式规范

基本语法

参数列表

函数体

注意事项

如何定义函数接口

1.保证接口中只能有一个抽象方法

2.使用@FunctionalInterface注解标记该接口为函数接口

使用Lambda调用无参函数

使用Lambda调用有参函数

使用Lambda的精简写法

使用Lambda实现集合遍历

使用Lambda实现集合排序

使用Lambda实现线程调用


什么是Lambda表达式

Lambda 表达式是 Java 8 引入的一种新的语法特性,它可以使得代码更加简洁、易读,并且支持函数式编程。Lambda 表达式实际上就是一个匿名方法,它可以作为参数传递给方法或者存储在变量中。

Lambda表达式规范

基本语法

Lambda 表达式由参数列表、箭头符号和函数体组成。

(参数列表) -> 函数体

参数列表

Lambda 表达式可以有零个或多个参数。如果没有参数,可以使用空括号表示 ();如果只有一个参数,可以省略括号;如果有多个参数,需要使用逗号将它们分隔开。

() -> System.out.println("Hello")

x -> x * x

(x, y) -> x + y

函数体

Lambda 表达式的函数体可以是一个表达式,也可以是一个语句块。如果函数体只有一条表达式,可以直接写在箭头后面;如果函数体包含多条语句,需要使用大括号 {} 将它们括起来,并使用分号 ; 分隔。

x -> x * x

(x, y) -> { int sum = x + y; System.out.println(sum); }

类型推断:Lambda 表达式中的参数类型可以根据上下文进行推断,不需要显式地指定类型。编译器会根据参数的使用情况来确定参数的类型。

(x, y) -> x + y

注意事项

Lambda 表达式只能用于函数式接口,即只包含一个抽象方法的接口。在使用 Lambda 表达式时,需要根据函数式接口的抽象方法定义来确定参数列表和返回值类型

如何定义函数接口

定义一个函数接口需要满足以下两点:

1.保证接口中只能有一个抽象方法

2.使用@FunctionalInterface注解标记该接口为函数接口

@FunctionalInterface
public interface MyInterfaceByJava8 {
	
    void add();//只能存在一个抽象方法


}

使用Lambda调用无参函数

首先定义一个函数接口

@FunctionalInterface
public interface FuncInterface {
	void add();
}

接着实现并调用这个无参函数,这里展示传统的匿名内部类调用法,跟Lambda调用法。

public static void main(String [] args){
		//使用匿名内部类调用
		new FuncInterface(){
			
			@Override
			public void add() {
				System.out.println("匿名内部类实现调用");
			}
			
		}.add();
		
		//使用Lambda调用
		((FuncInterface)()->{System.out.println("Lambda实现调用");}).add();
		
	}

可以看到使用Lambda代码更加简洁优雅

使用Lambda调用有参函数

定义函数接口

@FunctionalInterface
public interface FuncInterface2 {
	int del(int id);
}

实现并调用

public static void main(String [] args){
		
		int id=101;
		//使用匿名内部类调用
		int result1=new FuncInterface2(){

			@Override
			public int del(int id) {
				System.out.println("匿名内部类实现调用:"+id);
				return 1;
			}
			
		}.del(id);
			
		//使用Lambda调用
		int result2=((FuncInterface2)(p)->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);
		
		
		System.out.println(result1);
		System.out.println(result2);
		
	}

使用Lambda的精简写法

当函数参数仅有一个时可以省略括号(没有参数时必须用空括号,不能省

//普通写法
int result2=((FuncInterface2)(p)->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);

//精简写法--省略参数园括号
int result2=((FuncInterface2)p->{System.out.println("Lambda实现调用:"+p);return 1;}).del(id);

当函数体只有一条语句可以省略{}

//普通写法
((FuncInterface)()->{System.out.println("Lambda实现调用");}).add();

//精简写法--省略函数体括号
((FuncInterface)()->System.out.println("Lambda实现调用")).add();

当函数体仅有一条语句且是返回语句时,可以省略return

//普通写法
int result2=((FuncInterface2)p->return 1).del(id);

//精简写法--省略return
int result2=((FuncInterface2)p->1).del(id);

使用Lambda实现集合遍历

public static void main(String [] args){
		List<String> names=Arrays.asList("小明","小黑","小红");
		
		//传统遍历--增强for
		for(String name:names){
			System.out.println(name);
		}
		
		//传统遍历--匿名内部类
		names.forEach(new Consumer<String>(){

			@Override
			public void accept(String name) {
				System.out.println(name);
			}
			
		});
		
		//Lambda表达式遍历
		names.forEach(name->System.out.println(name));
		
	}

使用Lambda实现集合排序

将学生集合的学生按照年龄排序

public static void main(String [] args){
		List<Student> students1=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));
		List<Student> students2=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));
		//传统排序--匿名内部类
		students1.sort(new Comparator<Student>(){

			@Override
			public int compare(Student stu1, Student stu2) {
				return stu1.getAge()- stu2.getAge();
			}});

		//Lambda
		students2.sort((stu1,stu2)->stu1.getAge()-stu2.getAge());//省略return
		
		
		
		
		System.out.println(students1);
		System.out.println(students2);
		
		
	}

使用Lambda实现线程调用

public static void main(String [] args){
		//传统调用
		new Thread(new Runnable(){

			@Override
			public void run() {
				System.out.println("子线程运行了");
			}
			
		}).start();
		
		//Lambda
		new Thread(()->System.out.println("子线程运行了")).start();
	}

文章来源:https://blog.csdn.net/qq_62262918/article/details/135395534
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。