JAVAEE细细看 进阶 18 - 新特性:函数式接口

1 篇文章 0 订阅
1 篇文章 0 订阅

函数式接口

有且仅有一个抽象方法的接口

如何检测一个接口是不是函数接口?
@FunctionalInterface
以这个符号标记并且不报错的,就是函数式接口

Java8在java.util.function包下预定义了大量的函数式接口供我们使用

  1. Supplier接口
  2. Consumer接口
  3. Predicate接口
  4. Function接口
一. Supplier 接口

Supplier: 包含一个无参的方法

  1. T get(): 获得结果
  2. 改方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
  3. Supplier接口被成为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法会生产什么类型的数据提供给我们使用
 Integer integer = supplierInteger(() -> 10000);
 System.out.println(integer);
public static Integer supplierInteger(Supplier<Integer> supplier) {
    return supplier.get();
}

二. Consumer 接口

Consumer: 包含两个方法

  1. void accept(T t): 给指定的参数执行此操作
  2. default Consumer andThen(Consumer after): 返回一个组合的Consumer,依次执行此操作,然后执行after操作
  3. Consumer接口也被称为消费型接口,它消费的数据类型由泛型指定
public class ConsumerDemo {
    public static void main(String[] args) {
        consumer("林青霞",(s) -> {
            System.out.println(s);
        });

        // 优化
        consumer("林青霞",s -> System.out.println(s));

        // 方法引用
        consumer("林青霞", System.out::println);

        //
        consumer("林青霞",s -> System.out.println(new StringBuffer(s).reverse().toString()));
        System.out.println("--------");

        // 两个consumer
        consumer("林青霞",s -> System.out.println(s), s -> System.out.println(new StringBuffer(s).reverse().toString()));
    }

    private static void consumer(String s, Consumer<String> consumer) {
        consumer.accept(s);
    }

    // 两个consumer
    private static void consumer(String s, Consumer<String> consumer1, Consumer<String> consumer2) {
        // 第一种
        consumer1.accept(s);
        consumer2.accept(s);
        
        // 第二种
        consumer1.andThen(consumer2).accept(s);
    }
}
三. Predicate接口

Predicate常用的四个方法

  1. boolean test(T t): 对给定的参数进行判断,返回一个布尔值
  2. default Predicate negate(): 返回一个逻辑的否定,对应逻辑非
  3. default Predicate and(Predicate other): 返回一个组合判断,对应短路与
  4. default Predicate or(Predicate other): 返回一个组合判断,对应短路或
public class PredicateDemo01 {
    public static void main(String[] args) {

      boolean b1 =  checkString("fjskk", s -> {
            return s.length() > 8;
        });
        System.out.println(b1);
        System.out.println("--------");

      // 简化
        boolean b2 = checkString("和hi法华寺hi方式", s -> s.length() > 8);
        System.out.println(b2);
    }
    // 判断给定的字符串的长度,是否大于8
    private static boolean checkString(String s, Predicate<String> pre) {
         // 直接返回
  //return pre.test(s);

   // 逻辑非操作
//   return !pre.test(s); 这两个是相同的
   return pre.negate().test(s);

    }
}
  boolean b4 = checkString("helloworld",s -> s.length() > 8, s -> s.length() < 15);
        System.out.println(b4);
    //同一个字符串给出两个不同的判断条件,最后把这两个判断的结果做逻辑与运算的结果作为最终的结果
    private static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2) {
//        boolean b1 = pre1.test(s);
//        boolean b2 = pre2.test(s);
//        boolean b = b1 && b2;
//        return b;

//        return pre1.and(pre2).test(s);
        return pre1.or(pre2).test(s);
    }


四. Function 接口

Function<T,R>: 常用的两个方法

  1. R apply(T t): 将此函数应用于给定的参数
  2. default Function andThen(Function after): 返回一个组合函数,首先将改函数应用于输入,然后after函数应用于结果
  3. Funtion<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值
public class FunctionDemo {
    public static void main(String[] args) {
//
        //定义一个方法,把一个字符串转换int类型,在控制台输出
        int i1 = fun("100",Integer::parseInt);
        System.out.println(i1);
        System.out.println("--------");

        //定义一个方法,把一个int类型的数据加上一个整数之后,转为字符串在控制台输出
        String s2 = fun(100, i2 -> i2 + 100 + "");
        System.out.println(s2);
        System.out.println("--------");

        //定义一个方法,把一个字符串转换int类型,把int类型的数据加上一个整数之后,转为字符串在控制台输出
        String s1 = fun1("200", s -> Integer.parseInt(s), i3 -> i3 + 100 + "");
        System.out.println("s1 = " + s1);
    }

    //定义一个方法,把一个字符串转换int类型,在控制台输出
    public static int fun(String s, Function<String, Integer> fun) {
        Integer apply = fun.apply(s);
        return apply;
    }
    
    //定义一个方法,把一个int类型的数据加上一个整数之后,转为字符串在控制台输出
    public static String fun(int k, Function<Integer, String> function) {
        return function.apply(k);
    }
    
    //定义一个方法,把一个字符串转换int类型,把int类型的数据加上一个整数之后,转为字符串在控制台输出
    private static String fun1(String s, Function<String, Integer> fun1, Function<Integer, String> fun2){
      return  fun1.andThen(fun2).apply(s);
    }
}

五. 案例
/*
    String s = "林青霞,30";
    请按照我指定的要求进行操作:
        1:将字符串截取得到数字年龄部分
        2:将上一步的年龄字符串转换成为int类型的数据
        3:将上一步的int数据加70,得到一个int结果,在控制台输出
    请通过Function接口来实现函数拼接
*/
public class FunctionTest {
    public static void main(String[] args) {
        String s = "林青霞,30";

        int result = fun(s, s1 -> s1.split(",")[1], s2 -> Integer.parseInt(s2), i -> i + 70);
        System.out.println("result = " + result);

    }

    private static int fun(String s, Function<String, String> fun1, Function<String, Integer> fun2, Function<Integer,Integer> fun3) {
        return fun1.andThen(fun2).andThen(fun3).apply(s);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值