java 8 新特性-函数式接口&lambda
来源:互联网 发布:数据库系统实现英文版 编辑:程序博客网 时间:2024/06/05 04:26
目录
- 目录
- 函数式接口
- 函数式接口定义默认方法
- 函数式接口定义静态方法
- 函数式接口定义javalangObject里的public方法
- 函数式接口里面允许子接口多继承
- 接口注解
- 接口的运用
- java8新增的函数式接口
- 函数式接口
函数式接口
函数式接口(functional interface 也叫功能性接口),简单来说函数式接口就是只包含一个抽象方法的接口,Java标准库中的java.lang.Runnable和java.util.Comparator都是函数式接口。
1.函数式接口定义默认方法
函数式接口里可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是函数式接口定义的;
2.函数式接口定义静态方法
函数式接口可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口定义的;
3.函数式接口定义java.lang.Object里的public方法:
函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成抽象方法(虽然他们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现;
4.函数式接口里面允许子接口多继承
函数式接口里面允许子接口继承多个父接口,但每个父接口都只能存在一个抽象方法,且必须相同的抽象方法。
- 下面几个为函数式接口的例子:
@FunctionalInterfacepublic interface Predicate<T> { boolean test(T t); default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) && other.test(t); } default Predicate<T> negate() { return (t) -> !test(t); } default Predicate<T> or(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) || other.test(t); } static <T> Predicate<T> isEqual(Object targetRef) { return (null == targetRef) ? Objects::isNull : object -> targetRef.equals(object); }}
@FunctionalInterfacepublic interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); …………
@FunctionalInterfacepublic interface A<T> extends Predicate, MyPredicate { /** * 1. * 父接口 MyPredicate与 Predicate中存在相同的抽象方法:boolean test(T t); * 因此子接口中的功能也只有 boolean test(T t); */ /** * 2. * 如果多个父接口有各自不同的抽象方法,则子接口也会存在继承多个抽象方法 * 此时,子接口就不是函数式接口 */}
接口注解
Java8特意为函数式接口提供了一个新的注解@FunctionalInterface,这个注解式非必须的,可以不写,但是如果你的同事在你的类里面添加了一个新的方法那你的接口实现就会报错了,添加上@FunctionalInterface你同事在编译期的时候就会报错误警告,算是一个规范吧。
接口的运用
- 函数式接口也是接口,依旧可以通过之前的调用方式,通过实现类来使用接口。
public class FunctionalInterfaceTest<T> implements Predicate<T>{ public static void main(String[] args) throws InterruptedException { Predicate p = new FunctionalInterfaceTest(); System.out.println(p.test(1)); } @Override public boolean test(T t) { return 1 % 2 == 0; }}
- 也可以通过Lambda表达式来实现抽象方法
public static void main(String[] args) throws InterruptedException { Predicate<Integer> p = a -> a % 2 == 1; System.out.println(p.test(5)); System.out.println(p.test(2));}
- 函数式接口和以前编码的比较
/** * java 8 之前通常使用匿名内部类完成 */Collections.sort(dtoList, new Comparator<PlatformCouponOrderDTO>() {@Overridepublic int compare(PlatformCouponOrderDTO a, PlatformCouponOrderDTO b) { return DateUtils.getMinutesBetween(a.getTime(), b.getTime()); } });/** * java 8 之后使用Lambda表达式实现函数式接口,使代码量明显减少许多 */ Collections.sort(dtoList, (a, b) -> DateUtils.getMinutesBetween(a.getTime(), b.getTime()));
- 使用函数式接口配合lambda表达式比以前通过内部类的方式实现简便了很多。
public class Demo1 { public static void main(String[] args) { runThreadByLambda(); runThreadByInnerClass(); } public static void runThreadByLambda() { /* Runnable就是一个函数式接口:他只有一个方法run()方法。 1、因为run()方法没有参数,所以 ->前面的()中不需要声明形参 2、run返回的是void,所以不需要return。 3、->后面写的代码其实就是定义在run方法内的代码。因为此处代码只有一行,所以{}也可以省略。如果此处多与一行,则无法省略。 */ Runnable runnable = () -> System.out.println("这个是用拉姆达实现的线程"); new Thread(runnable).start(); } public static void runThreadByInnerClass() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("这个是用内部类实现的线程"); } }; new Thread(runnable).start(); }}
java8新增的函数式接口
- java.util.function
java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:
阅读全文
0 0
- java 8 新特性-函数式接口&lambda
- [Java]Java8新特性-lambda表达式/语法/函数式接口
- Java8 新特性之一---------Lambda表达式和函数式接口
- Java8新特性Lambda表达式、函数式接口
- Java 8新特性: lambda
- JAVA 8 新特性 ---lambda
- Java 8 新特性 Lambda
- Java新特性:函数式接口
- W3Cschool Java 8新特性----> 函数式接口
- Java1.8新特性 Lambda/Stream/函数式编程
- JAVA8新特性 函数式编程Lambda
- 学习 Java 8 - 函数式接口 Lambda
- JDK 8.0 新特性——函数式接口和Lambda 表达式
- JDK 8.0 新特性——函数式接口和Lambda 表达式
- Java8 新特性-函数式接口,以及和Lambda表达式的关系
- Java 8 新特性之 Lambda 表达式
- Java 8新特性:lambda表达式
- Java 8 新特性 Lambda表达式
- C学习笔记(一)
- C/C++中typedef关键字用法总结
- A
- ASP.NET MVC多语言 仿微软网站效果
- 前端大杂烩
- java 8 新特性-函数式接口&lambda
- charles抓取https中出现unknow的解决方法
- 比特币与区块链
- 设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。
- heartbeats+elastic+kibana
- MAC 配置maven
- mycat1.6.5分片(字符串拆分hash)
- LeetCode
- SQLsever添加新用户