Lambda表达式
一 基础语法: java8 引入一个新的操作符 “->” 该操作符称为操作符或lambda 操作符
操作符将Lambda 表达式拆分成两个部分
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式所执行的功能,即Lambda体
语法格式一、无参,无返回值
() -> System.out.println("hello java8");
语法格式二、有一个参数,并且无返回值 (若参数只有一个 小括号可以不写)
(x)->
System.out.println(x);
例 有个Student 接口 里面只有一个方法 void student(T t);
Student<String> s =
(x)->
System.out.println(x);
s.
student(“hello”);
即打印出hello
语法格式三:有两个以上的参数,有返回值,并且Lambda体中有多条语句
注意:该接口必须是函数式接口 即接口内部只有一个方法
语法格式四:有两个以上的参数,有返回值,并且Lambda体中有一条语句
return 和大括号可以不写
语法格式五:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM可以根据上下文推断出数据类型,即“类型推断”
二、四大内置核心函数式接口
1、Consumer<T> : 消费型接口 (无返回值)
void accept(T t);
2、Supplier<T> : 供给型接口 (有返回值)
T get();
3、Function(T,R) : 函数型接口 (有参,有返回值)
R apply(T t);
4、Predicate<T> : 断言型接口 (做判断操作)
boolean test(T t);
注意:函数式接口 是一个接口 里面有且仅有一个方法,如在接口上部添加 @FunctionalInterface 注解,若如此 此接口在写一个未实现的方法是不会通过编译
1、Consumer<T> : 消费型接口 (无返回值)
void accept(T t);
2、Supplier<T> : 供给型接口 (有返回值)
T get();
3、Function<T,R> : 函数型接口
R apply(t)
4、Boolean
Predicate<T> : 断言型函数接口
boolea test(t);
三、方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“方法引用”
(可以理解为方法引用是Lambda 表达式的另外一种表现形式)
主要有三种语法格式:
对象::实例方法
类::静态方法
类::实例方法
注意:1、Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中的抽象方法的函数列表和返回值类型保持一致;
2、若Lambda 参数列表中的第一个参数是实例方法的调用者,第二个参数是实例方法的参数时,可以使用 ClassName
:: method )
注: 这方面知识点想要熟练使用要十分熟悉java类库或项目中的方法,方法引用需要返回值和参数全部对应上。本人水平,阅历经验需要加强,无法信手拈来java内部的方法,现实项目中可以用自己编写的方法。
// 对象::实例方法
@Test
public void test5() {
Person person = new Person(10, "张三");
Consumer<String> consumer = person::setName;
consumer.accept("abcedf");
System.out.println(person.getName());
}
此处程序结果为 abcdedf 。 (
留个映像,每次编程往这上面靠,时间长了也就掌握了)
// 类::静态方法
@Test
public void test6() {
Comparator<Integer> comparable = Integer::compare;
int num = comparable.compare(100, 20);
System.out.println(num);
}
此处程序结果为1
// 类::实例方法
@Test
public void test7() {