Function、Supplier、consume 优化代码

函数式接口

    • Function、Supplier、consumer 概述 【Java8】
    • 基于函数式编程优化代码案例
    • 场景1:通过 get 指定下标的值
    • 场景2:清空指定下标的值

Function、Supplier、consumer 概述 【Java8】

Java.util.function.Function 接口表示接受一个参数并产生结果的函数。【接收一个参数并返回结果的函数式接口
它定义了一个名为 apply 的抽象方法,该方法接受一个参数,并返回一个结果。【不接收参数但返回结果的函数式接口】
常见的用途是对给定的输入进行转换、映射或计算。例如:

Function<Integer, String> intToString = num -> String.valueOf(num);
String result = intToString.apply(42);

java.util.function.Supplier 接口表示一个供应商,它不接受任何参数,但返回一个结果。
它定义了一个名为 get 的抽象方法,该方法不接受参数,并返回一个结果。常见的用途是延迟计算或提供常量值。例如:

Supplier<String> supplier = () -> "Hello, World!";
String result = supplier.get();

java.util.function.Consumer 接口表示消费一个参数,并且不返回任何结果。【接收一个参数不返回结果】
它定义了一个名为 accept 的抽象方法,该方法接受一个参数并不返回任何结果。

List<String> list = Arrays.asList("apple", "banana", "orange");
Consumer<String> printConsumer = System.out::println;
list.forEach(printConsumer);

基于函数式编程优化代码案例

有一个实体类,为了扩充一些配置使用,创建了多个类似字段(比如0~9),如何基于下标去更新或获取

public class Data {
    private Integer len0;
    private Integer len1;
    private Integer len2;
    private Integer len3;
    private Integer len4;
    private Integer len5;
    private Integer len6;
    private Integer len7;
    private Integer len8;
    private Integer len9;
}

场景1:通过 get 指定下标的值

常见写法转集合

public List<Integer> convertLen() {
        List<Integer> resultList = Lists.newArrayList();
        resultList.add(getLen0());
        resultList.add(getLen1());
        resultList.add(getLen2());
        resultList.add(getLen3());
        resultList.add(getLen4());
        resultList.add(getLen5());
        resultList.add(getLen6());
        resultList.add(getLen7());
        resultList.add(getLen8());
        resultList.add(getLen9());
        return resultList;
    }

    public Integer getLen(int index) {
        if (index < 0) {
            return null;
        }
        List<Integer> lenList = convertLen();
        if (index > (lenList.size() - 1)) {
            return null;
        }
        return lenList.get(index);
    }

使用 Function 优化

static final List<Function<Data, Integer>> IDX_LENS_GET = List.of(
            Data::getLen0,
            Data::getLen1,
            Data::getLen2,
            Data::getLen3,
            Data::getLen4,
            Data::getLen5,
            Data::getLen6,
            Data::getLen7,
            Data::getLen8,
            Data::getLen9
    );

    public Integer getLen(int i) {
        if (i > -1 && i < IDX_LENS_GET.size()) {
            return IDX_LENS_GET.get(i).apply(this);
        }
        return null;
    }

场景2:清空指定下标的值

需要清空制定下标后的所有 len

List<Consumer<Integer>> idxLensSet = List.of(
            this::setLen0,
            this::setLen1,
            this::setLen2,
            this::setLen3,
            this::setLen4,
            this::setLen5,
            this::setLen6,
            this::setLen7,
            this::setLen8,
            this::setLen9
    );

    public void clearInvalidLen(int procLenSize) {
        int setSize = idxLensSet.size();
        procLenSize = Math.min(procLenSize, setSize);
        int clearSize = idxLensSet.size() - Math.max(procLenSize, 0);
        for (int i = 1; i <= clearSize; i++) {
            idxLensSet.get(setSize - i).accept(null);
        }
    }

你可能感兴趣的:(JDK,java,函数式接口,代码优化)