Java中内置的四种类型的接口

一、什么是函数型接口?
1.只有一个抽象方法的接口,叫做函数式接口
2.你可以使用Lambda表达式来创建该接口对象,若lambda抛出一受检异常(非运行时异常),那么该异常需要在目标接口的抽象上进行声明。
3.我们可以在一个接口上使用@FunctionalInterface注解,这样可以做一个检查他的函数式接口,同时javadoc也会声明,这个接口是一个函数式接口
4.在java.util.function包下定义了丰富的函数式接口

二、Java中常见的函数型接口
在这里插入图片描述
@FunctionalInterface 检测是否是函数式接口
java.lang.Runnable
java.util.Comparator


@FunctionalInterface 注解起校验作用,函数式接口只能有一个方法
@author enbo
@date 2020年6月30日

@FunctionInterface
public  interface User{
void service();
}
public class Dem{
     public static void main(String[] args){
       User u=new User(){
        public void service(){
            System.out.Println("hello");
      }  
     };
      User s=()->System.out.println("hello");
      run(u);
      run(s);
      public static void run(User user){
       user.service();
     }
  }
}

1.消费型接口(有参数,没有返回值)

  • 消费型接口 Consumer void accept(T t)
import java.util.function.Consumer;

public class day2 {
        public static void main(String[] args) {
            //匿名内部类方式
            Consumer<Double> consumer = new Consumer<Double>() {
                @Override
                public void accept(Double t) {
                    System.out.println("聚餐消费:" + t);
                }
            };
            //Lambda表达式方式
            Consumer<Double> consumer2 = t->System.out.println("聚餐消费:"+t);
            happy(consumer2,1000);

            //更简化的写法
            happy(t->System.out.println("聚餐消费:"+t),2000);
            happy(t->System.out.println("唱歌消费:"+t),1500);
            happy(t->System.out.println("按摩消费:"+t),3000);
        }

    public static void happy(Consumer<Double> consumer,double money){
        consumer.accept(money);
    }
}

2.供给型接口(没有参数,有返回值)

  • 供给型接口 Supplier T get()
import java.util.Arrays;
import java.util.Random;
import java.util.function.Supplier;

public class day3 {

        public static void main(String[] args) {
            //匿名内部类方式
            Supplier<Integer> supplier = new Supplier<Integer>(){
                @Override
                public Integer get() {
                    return new Random().nextInt(100);//产生指定长度的随机数数组
                }
            };

            int [] arr = getNums(supplier,5);
            System.out.println(Arrays.toString(arr));
            //Lambda表达式方式
            int [] arr2 = getNums(()->new Random().nextInt(100),10);
            System.out.println(Arrays.toString(arr2));
        }

        public static int[] getNums(Supplier<Integer> supplier,int count){
            int [] arr = new int[count];
            for (int i = 0; i < count; i++) {
                arr[i] = supplier.get();
            }
            return arr;
        }
}

3.函数型接口(有参数,有返回值)

  • 函数型接口 Function<T,R> R apply(T t)
import java.util.function.Function;

public class Demo6 {
    public static void main(String[] args) {
        //匿名内部类方式   
        Function<String,String> functionn = new Function<String,String>(){
            @Override
            public String apply(String str) {
                return str.toUpperCase();
            }
        };

        String str = handlerString(functionn,"abc");
        System.out.println(str);

        //Lambda表达式方式
        String str2 = handlerString(s->s.toUpperCase(),"abcefg");
        String str3 = handlerString(s->s.toLowerCase(),"ZXCVBN");
        System.out.println(str2);
        System.out.println(str3);
    }
    //
    public static String handlerString(Function<String,String> functionn,String str){
        return functionn.apply(str);
    }
}

4.断言型接口(有参数,有返回值)

  • 断定型接口 Predicate boolean test(T t)
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class Demo7 {
    public static void main(String[] args) {
        //准备数据   
        List<String> list = new ArrayList<String>();
        list.add("张三丰");
        list.add("张学友");
        list.add("张无忌");
        list.add("迪丽热巴");
        list.add("刘亦菲");
        //匿名内部类方式   
        Predicate<String> predicate = new Predicate<String>(){
            @Override
            public boolean test(String t) {
                //业务逻辑,把姓为张的名字过滤出来  或者名字长度大于7的
                if(t.startsWith("张")){
                    return true;
                }
                return false;
            }
        };

        List<String> resultList = filterNames(predicate,list);
        System.out.println(resultList.toString());

        //Lambda表达式方式
        //姓张的
        List<String> resultList2 = filterNames(s->s.startsWith("张"),list);
        System.out.println(resultList2.toString());

        //名字长度大于3
        List<String> resultList3 = filterNames(s->s.length()>3,list);
        System.out.println(resultList3.toString());
    }
    //
    public static List<String> filterNames(Predicate<String> predicate,List<String> list){
        List<String> resultList = new ArrayList<String>();
        for (String string : list) {
            if(predicate.test(string)){
                resultList.add(string);
            }
        }
        return resultList;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值