函数式接口设计

1.Supplier<T> 接口定义:
基本特点:只出不进
编程范式:作为方法/构造参数、方法返回值
使用场景:数据来源,代码替代接口

代码如下:

public class SupplierDesignDemo {
    public static void main(String[] args) {
        echo("Hello,World");//固定参数

        echo(() ->{//变化实现
            sleep(1000);
            return "Hello,World";
        });
        echo(SupplierDesignDemo::getMessage);

        getMessage();//及时返回数据

        Supplier<String> message = supplyMessage();//待执行数据
        
        message.get();//实际执行
    }

    private static String getMessage(){
        sleep(1000);
        return "Hello,World";
    }

    private static Supplier<String> supplyMessage() {
        return SupplierDesignDemo::getMessage;
    }

    public static void sleep(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void echo(String message) {//拉的模式
        System.out.println(message);
    }

    public static void echo(Supplier<String> message) {//推的模式
        System.out.println(message.get());
    }
}

2.Consumer<T>接口设计:
基本特点:只进不出
编程范式:作为方法/构造参数
使用场景:执行Callback

3.Function<T,R>接口设计:
基本特点:有进有出
编程范式:作为方法/构造参数
使用场景:类型转换,业务处理等

代码如下:

public class FunctionDesignDemo {
    public static void main(String[] args) {

        Function function = a -> a;

        //Function 可以用于同类转换
        Function<Integer,Integer> divide2 = a -> a / 2;
    }
}

4.Predicate<T>接口设计:
基本特点:boolean类型判断
编程范式:作为方法/构造参数 通常不会放到方法返回值中
使用场景:过滤,对象比较等

代码如下:

public class PredicateDesignDemo {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        Collection<Integer> even = filter(numbers,num -> num % 2 == 0);

        Collection<Integer> odd = filter(numbers,num -> num % 2 != 0);

        System.out.println(even);

        System.out.println(odd);

        Stream.of(1,2,3,4,5).filter(num -> num % 2 == 0).forEachOrdered(System.out::println);
    }

    private static  <E> Collection <E> filter (Collection <E> source, Predicate <E> predicate) {
        //集合类操作,请不要直接利用参数  少量操作时使用
        List <E> copy = new ArrayList <E>(source);
        Iterator <E> iterator = copy.iterator();
        while (iterator.hasNext()) {
            E element = iterator.next();
            if (!predicate.test(element)) {
                iterator.remove();
            }
        }
        return Collections.unmodifiableList(copy);//保持只读
        
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值