Java8 Lambda表达式和函数式接口

Lambda表达式

Lambda表达式是一个匿名函数

本质

函数式接口的实例

作用

语法糖,代替匿名实现类对象

核心思路

可推断的可省

格式

()->{}

() Lambda形参列表,接口中的抽象方法的形参列表

-> Lambda操作符,箭头操作符

{} Lambda体,重写的抽象方法的方法体

使用场景:当需要对一个函数式接口实例化时 -> 用匿名实现类实现的都可以用Lambda表达式

Lambda表达式可以看成函数式接口实现类的对象(实例) -> 以前用匿名实现类表示的现在可以用Lambda表达式来写

Lambda的使用

Lambad形参列表

1.只有一个参数 -> 小括号可以省略

2.参数类型可以推断出来(基本都行) -> 可以省略

Lambda体

只有一条语句 -> 大括号、return可以省略


Comparator <Double> com = new Consumer<Double>() {
@Override
public void accept(Double aDouble) {
System.out.println("购物花了"+aDouble);
}
}) /*
简化1:Comparator <Double> com Double可以推断出 new Consumer<Double>()与Double aDouble里的类型为Double
Comparator <Double> com = new Consumer<>(){
public void accept(aDouble) {
System.out.println("购物花了"+aDouble);
}
} 简化2:Consumer为函数式接口
接口只声明了一个抽象方法 -> 所以实现类实现的方法只能是此方法,所以可以省略
Comparator <Double> com = aDouble -> System.out.println("购物花了"+aDouble) */ //Lambda表达式
Comparator <Integer> -com = aDouble -> System.out.println("购物花了"+aDouble)

函数式接口FunctionalInterface

定义

接口只声明了一个抽象方法,实现类只能实现该方法所以可以省略new Runnable(){@ovverride public void run}

表示

@FunctionalInterface

说明

Lambda表达式可以看成函数式接口实现类的对象 -> 以前用匿名实现类表示的现在可以用Lambda表达式来写

java.util.funciton包下定义了java8的函数式接口

Java内置四大核心函数式接口

函数时式接口 参数类型 返回类型 用途
Consumer<T>消费型接口 T void 对类型为T的对象应用操作,包含方法:void accept(T t),接受一个参数不返回
Supplier<T>供给型接口 T 返回类型为T的对象,包含方法:T get(),不提供参数返回一个值
Function<T,R>函数型接口 T R 对类型为T的对象应用操作,并返回结果。结果是R类型的对象。包含方法:R apply(T t)
Predicate<T>断定型接口 T boolean 确定类型为T的对象是否满足某约束,并返回boolean值,包含方法:boolean test(T t) 根据一定的规则过滤

如果自定义的接口符合上述接口的特征,就没有必要自己定义,直接使用就可以了。

class Test{
public void test(){
//原来的写法
happyTime(500, new Consumer<Double>() {
@Override
public void accept(Double aDouble) {
System.out.println("购物花了"+aDouble);
}
}); //Lambda表达式
happyTime(600,aDouble -> System.out.println("购物花了"+aDouble));
}
} /具体的Consumer接口实现类由调用函数时确定
public void happyTime(double money, Consumer<Double> con){
con.accept(money); //accept为Consumer的抽象方法
}

方法引用

使用情况

当要传递给Lambda体{}的操作,已经有实现方法(不需要我们自己去写,直接调用写好的方法)了,可以使用方法引用。

说明

方法引用就是Lambda表达式,也是函数式接口的一个实例,通过方法的名字来指向一个方法,也就是Lambda表达式的语法糖。

要求

实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致(针对情况1和情况2)

//这里的直接调用写好的方法
//Integer.compare方法引用的参数列表o1,o2,返回值为int
//Comparator实现类的列表和返回值也是一样的,所以可以使用方法引用
Comparator<Integer> com = (o1,o2) -> Integer.compare(o1,o2); //方法引用
Comparator<Integer> com = Integer::compare

格式

情况1.对象::非静态方法

情况2.类::静态方法

情况3.类::非静态方法

//Consumer中的抽象方法void accept(T t)
//方法引用的方法:PrintStream中的void println(T t)
Consumer<String> con1 = str -> System.out.println(str);
con1.accept("北京");
System.out.println("*******"); //方法引用替换的是Lambda体 //情况1:对象::非静态方法
PrintStream ps = System.out;
Consumer <String> con2 = ps::println;
con1.accept("beijing"); //情况2:类::静态方法
Comparator<Integer> com1 = (t1, t2) -> Integer.compare(t1,t2);
System.out.println(com1.compare(12, 21));
Comparator<Integer> com2 = Integer::compare;
System.out.println(com2.compare(12, 21)); //情况3:类::非静态方法
//Comparator中的int compare(T t1,T t2)
//String中的int t1.compareTO(t2)
//第一个参数t1调用了,在参数列表就没有必要写了,方法引用时的类就是调用者的类 这样才保证参数都使用上了
Comparator<String> com3 = (s1,s2) -> s1.compareTo(s2);
System.out.println(com3.compare("abc", "abd"));
Comparator<String> com4 = String::compareTo;
System.out.println(com4.compare("abc", "abd"));

构造器引用

类似方法引用.函数式接口的抽象方法的形参列表和构造器的形参列表一致

抽象方法的返回值类型即为构造器所属的类的类型,也就是写在冒号前面的类

//构造器引用
//Supplier中的T get()
//Employee的空参构造器Employee()
Supplier <Employee> sup1 = () -> new Employee();
Supplier <Employee> sup2 = Employee::new; //Function中的R apply(T t)
Function<Integer,Employee> func1 = id-> new Employee(id);
func1.apply(1001);
Function<Integer,Employee> func2 = Employee::new;
func2.apply(1002);

Java8 Lambda表达式、函数式接口和方法引用的更多相关文章

  1. 009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用

    一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 defaul ...

  2. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  3. java8函数式接口详解、函数接口详解、lambda表达式匿名函数、方法引用使用含义、函数式接口实例、如何定义函数式接口

    函数式接口详细定义 函数式接口只有一个抽象方法 由于default方法有一个实现,所以他们不是抽象的. 如果一个接口定义了一个抽象方法,而他恰好覆盖了Object的public方法,仍旧不算做接口的抽 ...

  4. java8学习之深入函数式接口与方法引用

    函数式接口: 函数式接口[FunctionalInterface]是整个Lambda表达式的一个根源,换句话来说java8中的Lambda表达式要想彻底掌握,前提是要彻底理解好函数式接口,所以这次继续 ...

  5. java8之lambda表达式(2)-方法引用

    方法引用使用的地方也是在函数式接口,使用方法引用可以使代码更加简单和便捷 在如下代码中 根据List中字符串长度排序的代码可以写成如下: public static void test1_() { L ...

  6. java8 array、list操作 汇【4】)- Java8 Lambda表达式 函数式编程

    int tmp1 = 1; //包围类的成员变量 static int tmp2 = 2; //包围类的静态成员变量 //https://blog.csdn.net/chengwangbaiko/ar ...

  7. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  8. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

  9. java8 快速入门 lambda表达式 Java8 lambda表达式10个示例

    本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...

随机推荐

  1. When overwhelmed, take a break

    When overwhelmed by, frustrated with, or tired of the work, taking a break will help with thinking a ...

  2. 30分钟通过Kong实现.NET网关

    什么是Kong Openrestry是一个基于Nginx与Lua的高性能平台,内部有大量的Lua库.其中ngx_lua_moudule使开发人员能使用Lua脚本调用Nginx模块.Kong是一个Ope ...

  3. IDM使用教程:利用IDM下载百度网盘文件

    IDM是什么 其实我使用IDM下载器只是为了方便网页版百度网盘直接下载大于40M文件而已,大家知道文件过大必须打开客户端才能下载,这点对于我的破电脑感觉很烦躁,每次要等待它慢悠悠打开,然后动用我的超级 ...

  4. CSP2020-儒略历

    大家可以在洛谷提交: 题目描述 为了简便计算,天文学家们使用儒略日(Julian day)来表达时间.所谓儒略日,其定义为从公元前 4713 年 1 月 1 日正午 12 点到此后某一时刻间所经过的天 ...

  5. @RequestAttribute与@MatrixVariable

    @RequestAttribute 它只能使用在方法入参上,从request请求参数中获取对应的属性值. //路径跳转 @GetMapping("/goto") public St ...

  6. pip 常用命令小结

    pip 常用命令小结 pip这个工具我们经常会用到,毕竟python 是一门以第三方库庞大而著名的编程语言,所以我们总会用pip 安装一些依赖库,当然这只是pip 最常用的一个命令,下面就来介绍一下 ...

  7. linux查看和修改时间

    查看时间: # date Fri Jan 11 18:04:10 CST 2020设置时间 # date -s "19:20:30"设置日期+时间 # date -s " ...

  8. storm调用kafka重复消费的问题

    1. 实现IBolt接口的bolt需要显式调用collector.ack(); 2. 继承自BaseBasicBlot的bolt, 会帮你自动调用ack的

  9. python -m参数

    把模块当做脚本运行,标准库和第三方库都可以 会把当前路径添加到sys.path中

  10. PLSQL批量执行SQL文件方法

    当需要执行多个sql文件,或者某个脚本中,sql语句数量很多时,手动逐个逐条执行不是一个明智的选择. PLSQL为我们提供了便捷的工具.使用方式如下: [工具]--[导入表]--[SQL插入]--[选 ...