Lambda表达式介绍
Posted flying-snake
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda表达式介绍相关的知识,希望对你有一定的参考价值。
JDK1.8 中添加了 Lambda表达式,为 Java 添加了确实的函数式编程特性。
Lambda 表达式的类型是函数。但在 Java 中,Lambda 表达式是对像,他们必须依附于一类特别的对象类型——函数式接口。
Lambda 表达式最大的特点是:表示做什么,而非如何做。
函数式接口
举个例子:
定义一个接口,并添加 @FunctionalInterface 注解,声明其为一个函数式接口,该接口不接收参数并返回一个 String 类型的结果
@FunctionalInterface public interface MyInterface String test(); default String getMe() return "This is me";
测试接口,打印 1 到 10
public class MyTest public String testMyInterface(MyInterface myInterface) return "MyInterface accumulate result is: " + myInterface.test(); public static void main(String[] args) MyTest myTest = new MyTest(); String string = myTest.testMyInterface(() -> String str = ""; for (int i = 1; i < 10; i++) str += i + ","; return str; ); System.out.println(string);
关于函数式接口的声明有如下几个注意点
- 一个函数式接口只有精确的一个抽象方法,静态方法与默认方法不计算在内
- 如果在接口中声明了一个重写 java.lang.Object类 中的公有方法的抽象方法,那么该抽象方法不计入函数式接口的抽象方法中
- 原因:接口总会直接或间接继承自 java.lang.Object类
- 函数式接口的实例可以通过 lambda表达式、方法引用,或构造方法引用来创建
- 当不满足下述条件时,编译器将报错
- 类型是接口类型,而非注解、枚举或类
- 被注解的接口需满足上述的函数式接口的要求
- 如果某个接口只有一个抽象方法,但并没有给该接口声明 FunctionInterface 注解,编译器依旧会将该接口看作是函数式接口
- 函数式接口的实现类的地址中会带上lambda
java.util.function 包中几个主要的接口
- Function
- 接收一个参数,并返回一个结果
- 获取执行结果的方法:apply
- Consumer
- 接收一个参数,不返回结果
- 调用方法:accept
- Predicate
- 接收一个参数,返回一个 boolean 类型的结果
- 计算结果的方法:test
- Supplier
- 不接收任何参数,返回一个结果
- 可作工厂用
- 生产方法:get
- java.util.function 中还提供了上述方法的各种变形
- 还有,为了提高执行效率,还针对原生类型(int,double,long)提供了相应的接口
以上是关于Lambda表达式介绍的主要内容,如果未能解决你的问题,请参考以下文章