Java8新特性—四大内置函数式接口( 二 )


再看一个栗子:
/** * @author vchicken * @version 1.0 * @description FunctionTest * @date 2022/11/10 12:10:06 */public class FunctionTest<T,R> {public static void main(String[] args) {FunctionTest<Integer, Integer> functionTest1 = new FunctionTest<>();System.out.println(functionTest1.functionTest(null, s -> s == null ? 0 : s));System.out.println(functionTest1.functionTest(100, s -> s == null ? 0 : s));System.out.println(functionTest1.functionTest(10, s -> s + 1));FunctionTest<String, String> functionTest2 = new FunctionTest<>();System.out.println(functionTest2.functionTest(null, s -> s == null ? "空的" : s));System.out.println(functionTest2.functionTest("hello world!", s -> s == null ? "空的" : s));}public R functionTest(T in,Function<T,R> function){return function.apply(in);}}执行结果:
010011空的hello world!结合两个栗子我们可以看出来:

我们可以使用Function接口来将同一个方法的处理逻辑抽象出来,在调用方法的时候,将处理逻辑以Lambda表达式的形式传入,实现同一个方法可以处理不同的代码逻辑,而且使用泛型来表示方法的出入参,可以避免不必要的类型转换和异常发生 。@vchicken
Function接口在JDK中的应用在JDK1.8中的新属性Stream中,就使用到了Function接口,看下面的源码:
Java8新特性—四大内置函数式接口

文章插图
通过一个例子来看看怎样使用map这个接口
public static void main(String[] args) {Stream<Integer> stream = Stream.of(-1,0,1,2,3,4);Stream<Integer> stream1 = stream.map(integer -> integer + 1);stream1.forEach(System.out::println);}执行结果:
012345案例:将数组中的数,依次平方,等到一个一个新的数组
List<Integer> myList = new ArrayList<>();myList.add(-2);myList.add(0);myList.add(1);myList.add(3);myList.add(5);myList.add(7);List<Integer> collect = myList.stream().map(integer -> integer*integer).collect(Collectors.toList());collect.forEach(System.out::println);执行结果:
401925492.Consumer接口什么是Consumer接口?
Java8新特性—四大内置函数式接口

文章插图
从源码可以看出,Consumer与Function类似,只有一个accept抽象方法待实现,只不过唯一的区别是,Consumer的accept使用void修饰,没有返回值 , 而Function有返回值 。
Consumer接口又称为消费型接口 , 顾名思义 , 入参传入后,被accept方法消费掉了,什么都没得到 。
举个栗子:
public static void main(String[] args) {Consumer<Object> consumer1 = new Consumer<Object>() {@Overridepublic void accept(Object o) {System.out.println("这次消费了:" + o.toString());}};consumer1.accept("100w元在双十一!这下穷死了!");Consumer<String> consumer2 = s -> System.out.println("这次消费了:" + s);consumer2.accept("120w元在双十二!又穷死了!");}执行结果:
这次消费了:100w元在双十一!这下穷死了!这次消费了:120w元在双十二!又穷死了!同样的,我们可以提取公共方法为:
/** * @author vchicken * @version 1.0 * @description ComsumerTest * @date 2022/11/10 17:14:11 */public class ConsumerTest<T> {public static void main(String[] args) {ConsumerTest<String> consumerTest = new ConsumerTest<>();consumerTest.accept("100w元在双十一!这下穷死了!", s -> System.out.println("这次消费了:" + s));consumerTest.accept("120w元在双十二!又穷死了!", s -> System.out.println("这次消费了:" + s));}public void accept(T in, Consumer<? super T> consumer) {consumer.accept(in);}}执行结果:
这次消费了:100w元在双十一!这下穷死了!这次消费了:120w元在双十二!又穷死了!Consumer接口在JDK中的应用
Java8新特性—四大内置函数式接口

文章插图
同样的 , 我们以Stream中的forEach为例,看下面的例子:
Stream<Integer> stream = Stream.of(-1,0,1,2,3,4); stream.forEach(s-> System.out.println(s));执行结果:
-101234同样的我们还可以使用方法引用来打印,效果一致
stream.forEach(System.out::println);
对于方法引用不了解的亲,也可以阅读这篇文章Java8 新特性 - 方法引用@vchicken
3.Suppiler接口什么是Suppiler接口?既然我们上面说到了Consumer为消费型接口,按照惯例,那肯定有生产型接口或者也可以成为

推荐阅读