目录
初识Lambda表达式
Lambda表达式是JDK8开始后的一种新语法形式,Lambda允许把函数作为一个方法的参数,使用Lambda表达式可以写出更简洁、更灵活的代码,而其作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
Lambda表达式的使用条件
函数式接口
Lambda 表达式和 方法引用使用的前提!!!
JDK 1.8 版本以上有效
@FunctionalInterface 语法格式严格要求当前接口【有且只能有一个】尚未完成的 缺省属性为 public abstract 修饰方法。我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以用于检测它是否是一个函数式接口。
Lambda表达式的入门使用
创建函数式接口
@FunctionalInterface
interface A {
void test ();
}
创建匿名内部类实现方式
public static void main(String[] args) {
/*
1. 匿名内部类方式
*/
testLambda(new A() {
@Override
public void test() {
System.out.println("无参数返回值 匿名内部类对象方法实现");
}
});
}
/**
* Lambda 测试方法,当前方法所需参数是 A 接口实例化对象,因为当前 A 接口
* 是一个函数式接口,可以使用 Lambda 表达式解决问题
*
* @param a 函数式接口 A
*/
public static void testLambda(A a) {
a.test();
}
Lambda表达式实现
/*
2. Lambda 表达式实现
【分析】
void test();
接口方法【返回值】 void
接口方法【参数】 无参数
Lambda 格式
() -> {大括号中无需返回值类型}
*/
testLambda(() -> {
System.out.println("Lambda 表达式初体验");
});
// 【注意】Lambda 表达式有且只有一行代码,可以省略大括号
testLambda(() -> System.out.println("Lambda 表达式初体验"));
Lambda表达式的语法格式
1、Lambda表达式的标准语法格式
- Lambda表达式在Java语言中引入了一个操作符“ -> ”,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:
- 左侧:指定了Lambda表达式需要的所有参数
- 右侧:制定了Lambda体,即Lambda表达式要执行的功能
Lambda表达式的书写格式:
(联想参数临时变量)->{
执行任务的代码块
}
注:->是语法形式,无实际意义
2、Lambda表达式的省略方式
1. 参数类型可以省略不写
2. 如果只有一个参数,参数类型可以省略不写,同时()也可以省略
3. 如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写(需要同时省略)
实例演示:
创建集合并添加元素
//1创建集合并添加元素
Collection<String> coll = new ArrayList<>();
coll.add("zhangsan");
coll.add("lisi");
coll.add("wangwu");
匿名内部类
//2.利用匿名内部类的形式
//底层原理
//其实也会自己遍历集合,依次获取到每一个元素
//把得到的每一个元素,传递给线面的accept方法
//s依次表示集合中的每一个数据
coll.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
Lambda表达式(只有一个参数)
//lambda表达式
coll.forEach(s-> System.out.println(s));
两个参数
//创建一个需要排序的数组
Integer[] arr = {2, 4, 3, 5, 6, 1};
//匿名内部类
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
//lambda表达式
Arrays.sort(arr, (Integer o1, Integer o2)->{
return o2 - o1;
});
//lambda表达式简化版
Arrays.sort(arr, (o1, o2) -> o2 - o1);
Lambda常用接口
比较器接口
@FunctionalInterface
interface Comparator<T> {
/**
* 比较器接口要求的方法,参数是泛型参数,用户指定类型
*
* @param o1 用户在使用接口时约束的泛型对应具体数据类型参数
* @param o2 用户在使用接口时约束的泛型对应具体数据类型参数
* @return 返回值为 int 类型,0 表示两个元素一致。
*/
int compare(T o1, T o2);
}
过滤器接口
// 过滤器接口,判断器接口,条件接口
@FunctionalInterface
interface Predicate<T> {
/**
* 过滤器接口约束的方法,方法参数是用户使用时约束泛型对应具体数据参数
* 返回值类型是 boolean 类型,用于条件判断,数据过来
*
* @param t 用户约束泛型对应的具体数据类型参数
* @return boolean 数据,判断结果反馈
*/
boolean test(T t);
}
类型转换器接口
// 类型转换器接口
@FunctionalInterface
interface Function<T, R> {
R apply(T t);
}