java 内置的四个标准的函数式接口

java 内置的4个标椎的函数式接口
    Supplier<T>      => T get();            提供者(没有进,只有出)
    Consumer<T>        =>void accept(T t); 消费者(只进不出)
    Function<T,R>    =>R apply(T t);     函数(一进一出,两个都是对象,可以用来修改,加密...)
    Predicate<T>    =>boolean test(T t);预测,过滤(进来对象,出来boolean,通常用于过

代码演示如下:

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @Author
 * @Date 2022/2/11
 * @Description:jdk 四个函数式接口
 * Predicate<T>
 * Function<T,T>
 * Supplier<int[]>
 * Consumer<T>
 */
public class JavaInnerFunctionalInterfaceTest<T> {
    private Object[] array;
    private  int size;

    public JavaInnerFunctionalInterfaceTest(int capacity) {
        array = new Object[capacity];
        size = 0;
    }
    //增加
    public void add(Predicate<T> filter, T...ts){
        if(ts.length>0){
            for (T t : ts) {
                if (filter.test(t)){
                    array[size++] =t;
                }
            }
        }
    }

    //删除
    public void removeIf(Predicate<T> filter){
        Object[] copy = new Object[size];
        int size = 0;
        for (Object o : array) {
            if (null ==o){
                break;
            }
            if (!filter.test((T)o)){
                copy[size++] =o;
            }
        }
        array = copy;
        this.size =size;
    }

    //修改
    public void modify(Function<T,T> func){
        for (int i = 0; i < size; i++) {
            array[i] = func.apply((T)array[i]);

        }
    }

    //判断截取输入的首尾偏移量有没有错
    private void checkIndex(int[] arr){
        if (arr.length!=2){
            throw new IllegalArgumentException("length of index array must be 2");
        }
        for (int ix : arr) {
            if (ix<0 ||ix>size){
                throw new ArrayIndexOutOfBoundsException(ix+" out of (0,+"+size+")");
            }
        }
        if (arr[0]>arr[1]){
            int t =arr[0];
            arr[0] = arr[1];
            arr[1] =t;
        }
    }

    //截取
    public Object[] subList(Supplier<int[]> supplier){
        int[] arr = supplier.get();
        checkIndex(arr);
        Object[] rtn = new Object[arr[1]-arr[0]+1];
        for (int i = arr[0],j=0; i <= arr[1]; i++) {
            rtn[j++] = array[i];
        }
        return rtn;
    }

    //查看
    public void show(Predicate<T> filter, Consumer<T> consumer){
        for (Object o : array) {
            if (null ==o){
                break;
            }
            if (!filter.test((T)o)){
                continue;
            }
            consumer.accept((T)o);
        }
    }
}

测试类:

public class Test {
    static class Stu{
        String name;
        int age;

        public Stu(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String toString() {
            return "Stu{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    public static void main(String[] args) {
        JavaInnerFunctionalInterfaceTest<Stu> test = new JavaInnerFunctionalInterfaceTest<Stu>(5);

        //只要18岁以上的学生
        test.add((stu)->stu.age>=18,
                new Stu("za",16),
                new Stu("zf",18),
                new Stu("as",25),
                new Stu("ls",21),
                new Stu("gdf",22),
                new Stu("zhdf",15)
                );
        //修改学生年龄
        test.modify((stu)->{
            stu.age+=1;
            return stu;
        });

        //删除姓名以"z"开头的学生
        test.removeIf((stu)->stu.name.startsWith("z"));
        //查看所有学生信息
        test.show((t)->true,(t)-> System.out.println(t));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值