什么时候可以使用Lambda?Lambda表达式通常用于函数式接口。函数式接口是从Java8开始引入的,它的描述比较简单:函数式接口(FunctionalInterface)是一种接口,只有一个抽象方法,但可以有多个非抽象方法。1.语法定义/***定义函数式接口*在接口上注解@FunctionalInterface*/@FunctionalInterfacepublicinterfaceICollectionService{/***定义打印方法*/voidprint();}Java8之前有大量的函数类型接口如下:java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.io.FileFilterjava.nio.file.PathMatcherjava.lang.reflect.InvocationHandlerjava.beans.PropertyChangeListenerjava.awt.event.ActionListenerjavax.swing。事件。ChangeListenerJava8新加入的函数式接口在java.util.function包下,里面包含了很多支持Java函数式编程的类。这个包中的函数接口包括:序号接口&描述1BiConsumer表示接受两个输入参数,不返回任何结果的操作2BiFunction表示接受两个输入参数的方法,返回一个结果3BinaryOperator表示一个方法,作用于两个相同类型的运算符的运算,并返回相同类型运算符的结果4BiPredicate表示一个带有两个参数的布尔值方法5BooleanSupplier表示布尔值结果的提供者6Consumer表示接受一个输入一个有参数且没有返回值的操作7DoubleBinaryOperator表示对两个双值运算符进行操作并返回一个双值结果。8DoubleConsumer表示接受双精度值参数且不返回结果的操作。9DoubleFunction表示接受double值参数并返回结果的方法10DoublePredicate表示带有double值参数的布尔值方法11DoubleSupplier表示double值结构提供者12DoubleToIntFunction接受double类型输入并返回int类型结果。13DoubleToLongFunction接受一个double类型的输入,返回一个long类型的结果14DoubleUnaryOperator接受一个也是double类型的参数,返回值类型也是double。15Function接受一个输入参数并返回一个结果。16IntBinaryOperator接受两个相同类型int的参数,返回值类型也是int。17IntConsumer接受一个int类型的输入参数,没有返回值。18IntFunction接受一个int类型的输入参数并返回一个结果。19IntPredicate:接受一个int输入参数并返回一个布尔结果。20IntSupplier没有参数,返回一个int类型的结果。21IntToDoubleFunction接受一个int类型的输入,返回一个double类型的结果。22IntToLongFunction接受一个int类型的输入,返回一个long类型的结果。23IntUnaryOperator接受一个与int相同类型的参数,返回值类型也是int。24LongBinaryOperator接受两个相同类型long的参数,返回值类型也是long。25LongConsumer接受一个long类型的输入参数,没有返回值。26LongFunction接受一个long类型的输入参数并返回一个结果。27LongPredicateR接受一个长型输入参数并返回一个布尔类型的结果。28LongSupplier没有参数,返回一个long类型的值。29LongToDoubleFunction接受一个long类型的输入并返回一个double类型的结果。30LongToIntFunction接受一个long类型的输入并返回一个int类型的结果。31LongUnaryOperator接受一个和long类型相同的参数,返回值类型也是long。32ObjDoubleConsumer接受一个对象类型和一个double类型的输入参数,没有返回值。33ObjIntConsumer接受一个对象类型和一个int类型的输入参数,没有返回值。34ObjLongConsumer接受一个对象类型和一个long类型的输入参数,没有返回值。35Predicate接受输入参数并返回布尔结果。36Supplier没有参数并返回一个结果。37ToDoubleBiFunction接受两个输入参数,返回一个double类型的结果38ToDoubleFunction接受一个输入参数,返回一个double类型的结果39ToIntBiFunction接受两个输入参数,返回一个int类型的结果。40ToIntFunction接受一个输入参数并返回一个int类型的结果。41ToLongBiFunction接受两个输入参数并返回一个long类型的结果。42ToLongFunction接受一个输入参数并返回一个long类型的结果。43UnaryOperator接受一个类型为T的参数,返回值类型也是T。用手指向左(右)滑动可以看到全貌。Java8提供的这么多函数式接口,开发中常用的函数式接口有3种:Predicate、Consumer、Function。2.功能接口实例2.1.Predicatejava.util.function.Predicate接口定义了一个名为test的抽象方法,它接受一个通用的T对象并返回一个布尔值。只要需要表示涉及类型T的布尔表达式,就会使用此接口,并且通常称为断言接口。使用Predicate接口实现字符串空操作@FunctionalInterfacepublicinterfacePredicate{/***根据给定的参数评估这个谓词。**@paramt输入参数*@return{@codetrue}如果输入参数匹配谓词,*否则{@codefalse}*/booleantest(Tt);...}publicstaticvoidmain(String[]args){/***借助Lambda表达式实现Predicate测试方法*/Predicatep01=(str)->str.isEmpty()||str.trim().isEmpty();/***测试传入的字符串是否为空*/System.out.println(p01.test(""));System.out.println(p01.test(""));System.out.println(p01.test("admin"));}测试结果:2.2、Consumerjava.util.function.Consumer接口定义了一个抽象方法accept,接受一个泛型T,没有return值(无效)。如果您需要访问类型T的对象并对其执行一些操作,则可以使用此接口,通常称为消费者接口。使用Consumer实现集合遍历操作@FunctionalInterfacepublicinterfaceConsumer{/***对给定的参数执行此操作。**@paramt输入参数*/voidaccept(Tt);...}/***借助Lambda表达式实现Consumeraccept方法*/Consumerc01=(collection)->{if(null!=collection&&collection.size()>0){for(Objectc:collection){System.out.println(c);}}};Listlist=newArrayList();list.add("诸葛亮");list.add("曹Cao");list.add("GuanYu");//遍历列表,输出元素内容到控制台c01.accept(list);2.3、Functionjava.util.function.Function接口定义了一个名为apply的方法,它接受一个泛型类型T的对象,并返回一个泛型R对象。如果你需要定义一个Lambda来将输入信息映射到输出,你可以使用这个接口(比如提取苹果的重量,或者将一个字符串映射到它的长度),通常称为函数式接口。使用Function实现用户密码Base64加密操作@FunctionalInterfacepublicinterfaceFunction{/***将此函数应用于给定的参数。**@paramt函数参数*@return函数结果*/Rapply(Tt);}//实现用户密码Base64加密操作Functionf01=(password)->Base64.getEncoder().encodeToString(password.getBytes());//输出加密字符串System.out.println(f01.apply("123456"));加密后的结果如下:2.4、Supplierjava.util.function.Supplier接口定义了一个get抽象方法,没有参数,返回一个泛型T对象,类似于工厂方法,经常被调用一个功能接口。使用Supplier实现SessionFactoryCreate@FunctionalInterfacepublicinterfaceSupplier{/***得到一个结果。**@returnaresult*/Tget();}/***生成会话工厂对象*/Suppliers=()->{returnnewSessionFactory();};s.get()。info();eSupplier{/***Getsaresult.**@returnaresult*/Tget();}/**生成会话工厂对象*/Suppliers=()->{returnnewSessionFactory();};s.get().info();