我们都知道java8的主要新特性是,stream流以及lambda表达式。
java8内置了很多函数式接口,但是最基本的四大函数式接口,已经足以应付绝大多数场景。
今天我们讲解一下,使用lambda表达式实现java8四大内置函数式接口。
一、消费型接口 Cousumer< T>
Cousumer类型接口没有返回值,参数为T,执行格式为accept(T t)
:
public static void main(String[] args) {
//使用lambda表达式调用happy 传递参数money
happy(398d,(m) ->System.out.println("大保健消费了"+m+"元"));
}
//Cousumer<T>类型接口没有返回值,参数为T,执行格式为`accept(T t)`:
public static void happy(Double money, Consumer<Double> consumer){
consumer.accept(money);
}
没有返回值,消费型接口是一个单向串行的操作。
大保健消费了398.0元
二、供给型接口 Supplier< T>
Supplier 类型接口返回值T,没有参数,执行格式为T get()
场景:产生指定个数的整数,并放入集合中返回
num指定了返回随机数的个数,supplier函数决定了,返回随机数的规则。
public static void main(String[] args) {
//获取十个 100以内随机数
List<Integer> intNum = getIntNum(10, () -> (int) (Math.random() * 100));
for (Integer integer : intNum) {
System.out.println("100以内随机数:"+integer);
}
}
//产生一定数量的整数,并返回集合
//supplier 指定了产生数的规则
//供给型接口
public static List<Integer> getIntNum(int num, Supplier<Integer> supplier){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
Integer integer = supplier.get();
list.add(integer);
}
return list;
}
根据lambda表达式条件,获取数据,没有参数,有返回值。
100以内随机数8
100以内随机数1
100以内随机数72
100以内随机数78
100以内随机数39
100以内随机数88
100以内随机数94
100以内随机数70
100以内随机数44
100以内随机数37
三、函数型接口 Function<T,R>
Function<T,R>类型接口参数为T,返回值为R,执行格式为R apply(T t)
public static void main(String[] args) {
String s = stringHandler("我是一个程序员 ", (str) -> str.replace("程序员", "帅哥").trim());
System.out.println(s);
}
//函数式接口
//传递一个字符串,返回一个字符串,
//function 决定了对字符串操作的表达式函数
public static String stringHandler(String str, Function<String,String> function){
return function.apply(str);
}
传递一个字符串,返回根据指定函数操作后的字符串。
我是一个帅哥
四、断言型接口 Predicate < T>
Predicate类型接口参数为T,返回值为Boolean,执行格式为Boolean test(T t)
public static void main(String[] args) {
List<String> list = Arrays.asList("张三", "李四", "王二麻子", "小酒鬼", "大胡子", "小胡");
List<String> ss = filterStr(list, (str) -> str.length() > 2);
for (String s : ss) {
System.out.println(s);
}
}
//将一定数量的字符串进行筛选返回
//predicate为判断条件
//断言式接口
public static List<String> filterStr(List<String> strs, Predicate<String> predicate){
List<String> list = new ArrayList<>();
for (String str : strs) {
if(predicate.test(str)){
list.add(str);
}
}
return list;
}
通过断言式接口判断集合中的元素,满足不满足lambda条件,满足则添加到新的集合返回。
王二麻子
小酒鬼
大胡子
注意:函数式接口里面的参数均为泛型操作,具体执行过程,可根据不同对象针对性的完成业务代码。
五、其他类型的一些函数式接口
除了上述得4种类型得接口外还有其他的一些接口供我们使用:
1).BiFunction<T, U, R>
参数类型有2个,为T,U,返回值为R,其中方法为R apply(T t, U u)
2).UnaryOperator(Function子接口)
参数为T,对参数为T的对象进行一元操作,并返回T类型结果,其中方法为T apply(T t)
3).BinaryOperator(BiFunction子接口)
参数为T,对参数为T得对象进行二元操作,并返回T类型得结果,其中方法为T apply(T t1, T t2)
4).BiConsumcr(T, U)
参数为T,U无返回值,其中方法为 void accept(T t, U u)
5).ToIntFunction、ToLongFunction、ToDoubleFunction
参数类型为T,返回值分别为int,long,double,分别计算int,long,double得函数。
6).IntFunction、LongFunction、DoubleFunction
参数分别为int,long,double,返回值为R。