Day20 学习java(1.8新特性)

Lambda表达式

介绍

Lambda表达式是一种没有名字的函数,也可称为闭包,是Java 8 发布的最重要新特性。

本质上是一段匿名内部类,也可以是一段可以传递的代码。

还有叫箭头函数的…

所谓闭包,就是能够读取其他函数内部变量的函数,比如在java中,方法内部的局部变量只能在方法内部使用,所以闭包可以理解为定义在一个函数内部的函数

闭包的本质就是将函数内部和函数外部链接起来的桥梁

特点

 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
 
 使用 Lambda 表达式可以使代码变的更加简洁紧凑。

和匿名内部类对比

public class Lambda_01 {
   

	public static void main(String[] args) {
   
		Integer[] arr = {
    1, 6, 8, 2, 0, 7, 9, 55 };
		// asList:把数组转换为List集合
		List<Integer> integers = Arrays.asList(arr);
		// 匿名内部类写法
		Collections.sort(integers, new Comparator<Integer>() {
   

			@Override
			public int compare(Integer o1, Integer o2) {
   
				// TODO Auto-generated method stub
				return o2 - o1;
			}
		});
		System.out.println(integers);
		// Lambda
		Collections.sort(integers, (i1, i2) -> i1 - i2);
		System.out.println(integers);
	}

}

在这里插入图片描述

应用场景

列表迭代

Map映射

Reduce聚合

代替一个不想命名的函数或是类,该函数或类往往并不复杂。

想尽量缩短代码量的各个场景均可以

代码实现

具体语法

  • (parameters) -> expression

  • (parameters) ->{ statements; }

语法特点

可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。

可选的大括号:如果主体包含了一个语句,就不需要使用大括号。

可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

	如果只有一条语句,并且是返回值语句,就可以不写return 不写 {}  
	如果写上{}  就必须写return 和 ;
	如果有多条语句,必须写{}  return 和 ;  也必须写

简单案例

  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)

函数式接口

介绍

英文称为Functional Interface

其本质是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

核心目标是为了给Lambda表达式的使用提供更好的支持,进一步达到函数式编程的目标,可通过运用函数式编程极大地提高编程效率。

其可以被隐式转换为 lambda 表达式。

特点

函数式接口是仅制定一个抽象方法的接口

可以包含一个或多个静态或默认方法

专用注解即@FunctionalInterface 检查它是否是一个函数式接口,也可不添加该注解
如果有两个或以上 抽象方法,就不能当成函数式接口去使用,也不能添加@FunctionalInterface这个注解
如果只有一个抽象方法,那么@FunctionalInterface注解 加不加 都可以当做函数式接口去使用

回调函数

简单来说就是回调函数,方法的参数是一个方法,在这个方法中对传递的方法进行调用

应用场景

想通过函数式编程,提高编程效率的各种场景均可。

代码实现

无参情况

有参情况

JDK自带常用的函数式接口

Supplier 接口

Supplier接口 代表结果供应商,所以有返回值,可以获取数据
有一个get方法,用于获取数据

Consumer 接口

Consumer接口 消费者接口所以不需要返回值

有一个accept(T)方法,用于执行消费操作,可以对给定的参数T 做任意操作

Function 接口

Function<T,R>接口 表示接收一个参数并产生结果的函数
顾名思义,是函数操作的

有一个R apply(T)方法,Function中没有具体的操作,具体的操作需要我们去为它指定,因此apply具体返回的结果取决于传入的lambda表达式

Predicate 接口

Predicate接口 断言接口
就是做一些判断,返回值为boolean

有一个boolean test(T)方法,用于校验传入数据是否符合判断条件,返回boolean类型

方法引用和构造器调用

概念说明

Lambda表达式的另外一种表现形式,提高方法复用率和灵活性。

特点

更简单、代码量更少、复用性、扩展性更高。

应用场景

若Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用。

不需要再复写已有API的Lambda的实现。

代码实现

方法引用

对象的引用::实例方法名
public class FunCall_01 {
   

	public static void main(String[] args) {
   
		Integer i1 = 10;
		// 方法调用
		String str = i1.toString();
		System.out.println(str);
		// lambda表达式写法
		Supplier<String> su = () -> i1.toString();
		System.out.println(su.get());
		// 方法引用写法
		Supplier<String> su1 = i1::toString;
		System.out
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值