java8 常用函数式接口

学习目标:

  • 掌握常用函数式接口
    • 只能一个抽象方法(可以包含多个默认方法或多个 static 方法)

学习内容:

  1. 函数式接口介绍

    如果一个接口中,只声明一个抽象方法,则此接口就称为函数式接口

    java.util.function下是jdk自带函数式接口

    不是每个接口都可以缩写成 Lambda 表达式。只有那些函数式接口(Functional Interface)才能缩写成 Lambda 表示式。

    1)Java从诞生起就一直倡导“万物皆可对象”,在Java里面向对象(OOP)编程是一切,但是随着python、Scala等语言的兴起和挑战,Java不得不作出调整以便支持更加广泛的技术要求,也即Java不但可以支持OOP还可以支持OOF(面向函数编程)

    2)在函数式编程语言中,函数被当作一等公民对待,在将函数作为一等公民的编程语言中,Lambda表达式的类型是函数,但是在Java8中,有所不同。在Java8注解,Lambda表达式是对象,而不是函数,它们必须依附于一类特别的对象类型—函数式接口

    3)简单地说:在Java8中,Lambda表达式就是一个函数式接口的实例。这就是Lambda表达式和函数式接口的关系。也即是说,只要一个对象是函数式接口的实例 ,那么该对象就可以用Lambda表达式来表达
    ————————————————
    版权声明:本文为CSDN博主「tianzhiya_ts」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/tianzhiya_ts/article/details/131475317

  2. 常用函数式接口

    1. Supplier接口,供应商

      @Test
          public void testFunction(){
              String s = getString(() -> "test");
              int i1 = getInt(()->{
                  IntFunction<int[]> intFunction = int[]::new;
                  int [] arr = intFunction.apply(10);
                  return arr.length;
              });
      
              List<String> list = getList(this::mylist);
              String s1 =  get(()->"test123");
              int i2 =  get(()->123);
      
              System.out.println(s);//test
              System.out.println(i1);//10
              System.out.println(list.size());//1
              System.out.println(s1);//test123
              System.out.println(i2);//123
      
          }
      
          private <T>  T get(Supplier<T> supplier){
              return supplier.get();
          }
          private List<String> mylist(){
              List<String> list = new ArrayList<>();
              for(int i = 0 ;i<10 ;i++){
                  list.add("list" + i);
              }
              return list;
          }
      
          public <W> List<W> getList(Supplier<List<W>> supplier){
              List<W> list = supplier.get();
              List<W> rest = new ArrayList<>();
              rest.add(list.get(0));
              return rest;
          }
      
          public Integer getInt(Supplier<Integer> supplier){
              return supplier.get();
          }
          public String getString(Supplier<String> supplier){
              return supplier.get();
          }

    2. Consumer接口,消费者
      1. 接口有两个方法,一个抽象方法
      2. 接口则正好与Supplier接口相反,他不是生产一个数据,而是消费一个数据,数据类型由泛型决定。Consumer接口中包含抽象方法void accept(T t),意思为消费一个指定泛型的数据

      1. ​
        @FunctionalInterface
        public interface Consumer<T> {
        
            /**
             * Performs this operation on the given argument.
             *
             * @param t the input argument
             */
            void accept(T t);
        
            
            default Consumer<T> andThen(Consumer<? super T> after) {
                Objects.requireNonNull(after);
                return (T t) -> { accept(t); after.accept(t); };
            }
        }
        
        ​

    3. Predicate接口

      需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用java,util.function.Predicate<T>和接口。Predicate接口中包含一个抽象方法:boolean test(T t)。

  3. 函数式接口应用

学习产出:

提示:这里统计学习计划的总量

例如:

  • 函数式编程源码
  • CSDN 技术博客1 篇
  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值