当前位置: 首页 > 科技观察

Java8Consumer、Supplier、Predicate、Function全攻略

时间:2023-03-14 19:48:10 科技观察

下面说说Consumer、Supplier、Predicate、Function接口的用法。在Java8的使用中,这些接口虽然没有大张旗鼓地使用,但却是默默润物细无声。你为什么这么说?这些接口都在java.util.function包下,分别是Consumer(消费类型)、supplier(供给类型)、predicate(谓词类型)、function(功能)。相信通过下面的讲解,你应该对这个接口的作用很清楚了。那么,下面,就从一个具体的应用场景来说说这个接口的用法吧!1从字面意思就可以看出Consumer接口。消费者界面是消费者界面。很简单,就是传入参数,然后输出值。Java8的一些方法看起来很抽象。其实,只要你了解了它,你就会发现它很好用,非常简单。下面我们来看一个例子,然后分析这个接口。1.1Consumer实例/***消费者接口测试*/@Testpublicvoidtest_Consumer(){//①使用消费者接口实现方法Consumerconsumer=newConsumer(){@Overridepublicvoidaccept(Strings){System.out.println(s);}};Streamstream=Stream.of("aaa","bbb","ddd","ccc","fff");stream.forEach(消费者);System.out。println("********************");//②使用lambda表达式,forEach方法需要的是一个Consumer接口stream=Stream.of("aaa","bbb","ddd","ccc","fff");Consumerconsumer1=(s)->System.out.println(s);//lambda表达式返回一个Consumer接口流。forEach(consumer1);//更直接的方式//stream.forEach((s)->System.out.println(s));System.out.println("*********************");//③使用方法引用,方法引用也是一个consumerstream=Stream.of("aaa","bbb","ddd","ccc","fff");Consumerconsumer2=System.out::println;stream.forEach(consumer);//更直接的方式//stream.forEach(System.out::println);}输出结果1.2实例分析①consumer接口分析在代码①中,我们直接创建了Consumer接口,并实现了一个名为accept的方法,这个方法就是这个接口的关键现在我们来看一个查看接受方法;此方法接受一个参数并且不返回值。当我们发现forEach需要一个Consumer类型的参数,传入之后,我们就可以输出对应的值。②使用lambda表达式作为consumerConsumerconsumer1=(s)->System.out.println(s);//lambda表达式返回一个Consumer接口在上面的代码中,我们使用下面的lambda表达式作为Consumer。仔细一看,会发现lambda表达式的返回值是一个Consumer;因此,你可以理解为什么forEach方法可以使用lambda表达式作为参数。③方法引用为consumerConsumerconsumer2=System.out::println;在上面的代码中,我们使用了一个方法引用作为Consumer,也可以传递给forEach方法。1.3其他Consumer接口除了上面使用的Consumer接口外,还可以使用下面的Consumer接口。IntConsumer、DoubleConsumer、LongConsumer、BiConsumer,方法同上。1.4消费者总结看完上面的例子,我们可以总结成几点。①Consumer是一个接口,只要实现了accept方法,就可以作为**“消费者”**输出信息。②其实lambda表达式的返回值和方法引用都是Consumer类型,所以可以作为forEach方法的参数,输出一个值。2Supplier接口Supplier接口是一个供应接口。其实说白了就是一个容器,可以用来存储数据,然后被其他方法使用。你到底懂不懂呢?如果你还不明白,请看一看。下面这个例子一定要吃透!2.1Supplier实例***Supplier接口测试,supplier是一个容器或者变量,可以存值*/@Testpublicvoidtest_Supplier(){//①使用Supplier接口实现方法,只有一个get方法,没有参数,返回一个值Suppliersupplier=newSupplier(){@OverridepublicIntegerget(){//返回一个随机值returnnewRandom().nextInt();}};System.out.println(supplier.get());System.out.println("********************");//②使用lambda表达式,supplier=()->newRandom().nextInt();System.out.println(供应商.get());System.out.println("************************");//③使用方法参考Suppliersupplier2=Math::random;System.out.println(supplier2.get());}输出结果2.2实例分析①供应商接口分析Suppliersupplier=newSupplier(){@OverridepublicIntegerget(){//返回一个随机值returnnewRandom().nextInt();}};看这段代码,我们通过创建一个Supplier对象实现了一个get方法,它没有参数,有返回值;所以,我们每次使用这个接口的时候,都会返回一个值,存储在这个接口中,所以它是一个容器。②lambda表达式作为Supplier//②使用lambda表达式,supplier=()->newRandom().nextInt();System.out.println(supplier.get());System.out.println("**********************”);在上面的代码中,我们使用lambda表达式返回了一个Supplier类型的接口,然后我们向上调用get方法就可以得到这个值。③方法引用为Supplier//③使用方法引用Suppliersupplier2=Math::random;System.out.println(supplier2.get());复制代码方法引用也返回一个Supplier类型的接口。2.3SupplierExample2看完第一个例子,我们应该有所了解,下面再看一个。/***Supplier接口测试2,使用需要Supplier的接口方法*/@Testpublicvoidtest_Supplier2(){Streamstream=Stream.of(1,2,3,4,5);//返回一个可选对象Optionalfirst=stream.filter(i->i>4).findFirst();//optional对象有一个方法需要Supplier接口//orElse,如果first里面有数字就返回这个数,如果不存在,就把传入的数放回去System.out.println(first.orElse(1));System.out.println(first.orElse(7));System.out.println("*********************");Suppliersupplier=newSupplier(){@OverridepublicIntegerget(){//返回一个随机值returnnewRandom().nextInt();}};//orElseGet,如果first中有一个数,则返回这个数,如果不存在,则返回supplier返回的值System.out.println(first.orElseGet(supplier));}输出结果码分析Optionalfirst=stream.filter(i->i>4).findFirst();使用该方法获取一个Optional对象,然后Optional对象中的orElse方法和orElseGet需要一个Supplier接口。//optional对象有一个方法需要Supplier接口//orElse,如果first中有一个数,则返回这个数,如果不存在,则返回传入的数System.out.println(first.orElse(1));System.out.println(first.orElse(7));System.out.println("*********************");Suppliersupplier=newSupplier(){@OverridepublicIntegerget(){//返回一个随机值returnnewRandom().nextInt();}};//或者ElseGet,如果first有一个数,就返回这个数,如果有不存在,则返回供应商返回的值System.out.println(first.orElseGet(supplier));orElse:如果first有一个数,就返回这个数,如果不存在,就返回传入的数orElseGet:如果first有一个数,就返回这个数,如果不存在,就返回供应商返回的值2.4其他供应商接口除了上面使用的供应商接口,您还可以使用以下供应商接口。IntSupplier、DoubleSupplier、LongSupplier、BooleanSupplier,方法同上。2.5Supplier概要①Supplier接口可以理解为一个存储数据的容器。②Supplier接口有一个get方法,可以返回一个值。3Predicate接口Predicate接口是一个谓词接口。其实这是一个类似bool类型判断的接口,后面会明白。3.1Predicate实例/***Predicate谓词测试,predicate其实就是一个类似bool*/@Testpublicvoidtest_Predicate()函数的判断函数{//①使用Predicate接口实现方法,只有一个测试方法,pass在一个参数中,返回一个bool值Predicatepredicate=newPredicate(){@Overridepublicbooleantest(Integerinteger){if(integer>5){returntrue;}returnfalse;}};System.out.println(predicate.test(6));System.out.println("********************");//②使用lambda表达式,predicate=(t)->t>5;System.out.println(predicate.test(1));System.out.println("********************");}输出结果3.2实例分析①Predicate接口分析//①使用Predicate接口实现方法,只有一个测试方法,传入一个参数,返回一个bool值Predicatepredicate=newPredicate(){@Overridepublicbooleantest(Integerinteger){if(整数>5){returntrue;}returnfalse;}};这段代码中,创建了一个Predicate接口对象,其中,实现类test方法,需要传入一个参数,返回一个bool值,所以这个接口的作用就是判断!System.out.println(predicate.test(6));再看,调用test方法,传入一个值,返回一个bool值。②使用lambda表达式作为谓词//②使用lambda表达式,predicate=(t)->t>5;System.out.println(predicate.test(1));System.out.println("********************");lambda表达式返回一个Predicate接口,然后调用test方法!3.3Predicate接口示例2/***Predicate谓词测试,使用Predicate作为接口*/@Testpublicvoidtest_Predicate2(){//①使用Predicate作为过滤接口,Predicate起到判断的作用Predicatepredicate=newPredicate(){@Overridepublicbooleantest(Integerinteger){if(integer>5){returntrue;}returnfalse;}};Streamstream=Stream.of(1,23,3,4,5,56,6,6);列表list=stream.filter(predicate).collect(Collectors.toList());list.forEach(System.out::println);System.out.println("*********************");}输出这段代码的结果,首先创建一个Predicate对象,然后实现测试方法,在测试方法中进行判断:如果传入的参数大于5、则返回真,否则返回假;Streamstream=Stream.of(1,23,3,4,5,56,6,6);Listlist=stream.filter(predicate).collect(Collectors.toList());列表.forEach(System.out::println);这段代码调用了Stream的filter方法。filter方法需要的参数是Predicate接口,所以这里只要数据大于5,就会输出。②Predicate通过执行一个测试方法来判断。4Function接口Function接口是一个函数接口,其功能之一就是将输入数据转换成另一种形式的输出数据。4.1函数接口实例/***函数测试,函数的作用是将一个值转换为另一个值*/@Testpublicvoidtest_Function(){//①使用map方法,泛型类型的第一个参数在转换类型之前,其次是转换后的类型Functionfunction=newFunction(){@OverridepublicIntegerapply(Strings){returns.length();//获取每个字符串的长度,并返回}};Streamstream=Stream.of("aaa","bbbbb","ccccccv");Streamstream1=stream.map(function);stream1.forEach(System.out::println);System.out。println("********************");}输出结果4.2代码分析①函数接口分析//①使用map方法,pan类型的第一个参数是转换前的类型,第二个是转换后的类型}};此代码创建一个Function接口对象并实现一个apply方法,该方法具有输入参数和输出参数。其中,泛型的第一个参数是转换前的类型,第二个是转换后的类型。上面代码中获取了字符串的长度,然后将每个字符串的长度作为返回值返回。②重要应用映射方法Streamstream=Stream.of("aaa","bbbbb","ccccccv");Streamstream1=stream.map(function);stream1.forEach(System.out::打印);Function接口的重要应用必须是Stream类的map方法。map方法传入一个Function接口,返回一个转换后的Stream类。4.3其他Function接口除了上面使用的Function接口,还可以使用下面的Function接口。IntFunction、DoubleFunction、LongFunction、ToIntFunction、ToDoubleFunction、DoubleToIntFunction等,使用方法同上。4.4Function接口概述①Function接口即函数式接口,是一种数据转换的函数。②Function接口实现了转换的apply方法。5小结通过前面的介绍,对Consumer、Supplier、Predicate、Function这几个接口有了详细的了解。便于使用!