lambda是 jdk1.8后添加的,匿名函数式的编程方法。
使用场景:
接口之中只有一个抽象方法时,可以用lambda表达式声明
@FunctionalInterface 该注解加在接口类上,声明该类为函数式接口,只会有一个抽象方法
方法有几个重要的组成元素
方法名 入参 回参 方法体
而基于接口的单个方法实现的匿名方法, 其方法名是可以省略,返回参数是可以直接推断。 所以这两个可以完全省略。
基本格式: () ->{} 小括号内定义入参,大括号内写方法体
可以省略的内容:
有且仅有一个参数时,小括号可以省略
方法体只有一行代码时, 大括号 与 return 关键字可以省略
参数的类型可以省略,因为参数类型在定义接口时已经固定,可以推断出来
方法引用
直接引用一个方法作为接口方法的实现,要求引用的方法入参回参都与接口定义一致
用法1 () -> 方法持有者::方法
用法2 构造方法的引用, ()-> 类::new
其会根据接口中定义的参数,自动调用匹配的构造方法
jdk 1.8内置的函数式编程支持包
java.util.function.*
其中预定义了很多的函数式接口模板, 不同的入参和回参
ListArray 中对函数式编程的应用
removeIf(Predicate<? super E> filter)方法,其中Predicate 是jdk内置的函数接口。 removeIf 中使用了该接口的方法作为删除条件。
所有使用该方法的方式示例 element -> element.indexof(“del”) >=0
foreach(Consumer<? super E> action) 方法, 循环获得集合中的元素,同时对每个元素做指定的事情。
用法 element -> System.out.println(element.name())
典型用法
package com.heiniao.test;
public class Test_lambda {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,0,19};
// num-> num> 6 实现了接口, num>6为过滤条件,将实现作为参数传给 filterTotal
int x = filterTotal(arr, num-> num> 6 );
System.out.println(x);
}
/**
* int 数组,对符合条件的数据进行相加 返回总值
* 具体的过滤实现 由用户实现并传进来
*/
public static int filterTotal(int[] arr, ArrayFilter<Integer> arrayFilter){
int sum = 0;
for (int a: arr) {
// 符合过滤条件的 加上
sum+= (arrayFilter.filter(a) ? a : 0);
}
return sum;
}
}
//定义函数式接口
@FunctionalInterface
interface ArrayFilter<T>{
public boolean filter(T t);
}