上一篇小乐带你们学过 Java8新特性-Lambda表达式,何时可使用Lambda?一般Lambda表达式是用在函数式接口上使用的。从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,可是能够有多个非抽象方法的接口。 java8引入@FunctionalInterface 注解声明该接口是一个函数式接口。java
/** * 定义函数式接口 * 接口上标注@FunctionalInterface 注解 */ @FunctionalInterface public interface ICollectionService { /** * 定义打印方法 */ void print(); }
在Java8 之前,已有大量函数式接口形式的接口(接口中只存在一个抽象方法),只是没有强制声明。例如:编程
Java8 新增长的函数接口在java.util.function 包下,它包含了不少类,用来支持 Java的 函数式编程,该包中的函数式接口有: segmentfault
序号 接口 & 描述
1 BiConsumer<T,U>表明了一个接受两个输入参数的操做,而且不返回任何结果
2 BiFunction<T,U,R>表明了一个接受两个输入参数的方法,而且返回一个结果
3 BinaryOperator<T>表明了一个做用于于两个同类型操做符的操做,而且返回了操做符同类型的结果
4 BiPredicate<T,U>表明了一个两个参数的boolean值方法
5 BooleanSupplier表明了boolean值结果的提供方
6 Consumer<T>表明了接受一个输入参数而且无返回的操做
7 DoubleBinaryOperator表明了做用于两个double值操做符的操做,而且返回了一个double值的结果。
8 DoubleConsumer表明一个接受double值参数的操做,而且不返回结果。
9 DoubleFunction<R>表明接受一个double值参数的方法,而且返回结果
10 DoublePredicate表明一个拥有double值参数的boolean值方法
11 DoubleSupplier表明一个double值结构的提供方
12 DoubleToIntFunction接受一个double类型输入,返回一个int类型结果。
13 DoubleToLongFunction接受一个double类型输入,返回一个long类型结果
14 DoubleUnaryOperator接受一个参数同为类型double,返回值类型也为double 。
15 Function<T,R>接受一个输入参数,返回一个结果。
16 IntBinaryOperator接受两个参数同为类型int,返回值类型也为int 。
17 IntConsumer接受一个int类型的输入参数,无返回值 。
18 IntFunction<R>接受一个int类型输入参数,返回一个结果 。
19 IntPredicate:接受一个int输入参数,返回一个布尔值的结果。
20 IntSupplier无参数,返回一个int类型结果。
21 IntToDoubleFunction接受一个int类型输入,返回一个double类型结果 。
22 IntToLongFunction接受一个int类型输入,返回一个long类型结果。
23 IntUnaryOperator接受一个参数同为类型int,返回值类型也为int 。
24 LongBinaryOperator接受两个参数同为类型long,返回值类型也为long。
25 LongConsumer接受一个long类型的输入参数,无返回值。
26 LongFunction<R>接受一个long类型输入参数,返回一个结果。
27 LongPredicateR接受一个long输入参数,返回一个布尔值类型结果。
28 LongSupplier无参数,返回一个结果long类型的值。
29 LongToDoubleFunction接受一个long类型输入,返回一个double类型结果。
30 LongToIntFunction接受一个long类型输入,返回一个int类型结果。
31 LongUnaryOperator接受一个参数同为类型long,返回值类型也为long。
32 ObjDoubleConsumer<T>接受一个object类型和一个double类型的输入参数,无返回值。
33 ObjIntConsumer<T>接受一个object类型和一个int类型的输入参数,无返回值。
34 ObjLongConsumer<T>接受一个object类型和一个long类型的输入参数,无返回值。
35 Predicate<T>接受一个输入参数,返回一个布尔值结果。
36 Supplier<T>无参数,返回一个结果。
37 ToDoubleBiFunction<T,U>接受两个输入参数,返回一个double类型结果
38 ToDoubleFunction<T>接受一个输入参数,返回一个double类型结果
39 ToIntBiFunction<T,U>接受两个输入参数,返回一个int类型结果。
40 ToIntFunction<T>接受一个输入参数,返回一个int类型结果。
41 ToLongBiFunction<T,U>接受两个输入参数,返回一个long类型结果。
42 ToLongFunction<T>接受一个输入参数,返回一个long类型结果。
43 UnaryOperator<T>接受一个参数为类型T,返回值类型也为T。 session
对于Java8中提供的这么多函数式接口,开发中经常使用的函数式接口有如下几个app
Predicate,Consumer,Function,Supplier。
java.util.function.Predicate<T> 接口定义了一个名叫 test 的抽象方法,它接受泛型 T 对象,并返回一个boolean值。在对类型 T进行断言判断时,可使用这个接口。一般称为断言性接口 。 函数式编程
使用Predicate接口实现字符串判空操做函数
@FunctionalInterface public interface Predicate<T> { /** * Evaluates this predicate on the given argument. * * @param t the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(T t); ... } public static void main(String[] args) { /** * 借助Lambda 表达式实现Predicate test方法 */ Predicate<String> p01=(str)->str.isEmpty()||str.trim().isEmpty(); /** * 测试传入的字符串是否为空 */ System.out.println(p01.test("")); System.out.println(p01.test(" ")); System.out.println(p01.test("admin")); }
测试代码测试
public static void main(String[] args) { /** * 借助Lambda 表达式实现Predicate test方法 */ Predicate<String> p01=(str)->str.isEmpty()||str.trim().isEmpty(); /** * 测试传入的字符串是否为空 */ System.out.println(p01.test("")); System.out.println(p01.test(" ")); System.out.println(p01.test("admin")); }
测试结果:this
java.util.function.Consumer<T>接口定义了一个名叫 accept 的抽象方法,它接受泛型T,没有返回值(void)。若是须要访问类型 T 的对象,并对其执行某些操做,可使用这个接口,一般称为消费性接口。 加密
使用Consumer实现集合遍历操做
@FunctionalInterface public interface Consumer<T> { /** * Performs this operation on the given argument. * * @param t the input argument */ void accept(T t); ... } /** * 借助Lambda表达式实现Consumer accept方法 */ Consumer<Collection> c01 = (collection) -> { if (null != collection && collection.size() > 0) { for (Object c : collection) { System.out.println(c); } } }; List<String> list = new ArrayList<String>(); list.add("诸葛亮"); list.add("曹操"); list.add("关羽"); // 遍历list 输出元素内容到控制台 c01.accept(list);
java.util.function.Function<T, R>接口定义了一个叫做apply的方法,它接受一个泛型T的对象,并返回一个泛型R的对象。若是须要定义一个Lambda,将输入的信息映射到输出,可使用这个接口(好比提取苹果的重量,或把字符串映射为它的长度),一般称为功能性接口。
使用Function实现用户密码 Base64加密操做
@FunctionalInterface public interface Function<T, R> { /** * Applies this function to the given argument. * * @param t the function argument * @return the function result */ R apply(T t); } // 实现用户密码 Base64加密操做 Function<String,String> f01=(password)->Base64.getEncoder().encodeToString(password.getBytes()); // 输出加密后的字符串 System.out.println(f01.apply("123456"));
加密后结果以下:
java.util.function.Supplier<T>接口定义了一个get的抽象方法,它没有参数,返回一个泛型T的对象,这相似于一个工厂方法,一般称为功能性接口。
使用Supplier实现SessionFactory建立
@FunctionalInterface public interface Supplier<T> { /** * Gets a result. * * @return a result */ T get(); } /** * 产生一个session工厂对象 */ Supplier<SessionFactory> s = () -> { return new SessionFactory(); }; s.get().info();
以上就是小乐带给你们的Java8新特性之函数式接口,下一篇将会为你们带来Java8新特性之方法引用,敬请关注。
转载请注明文章出处和做者,谢谢合做!