函数式编程

### 本篇文章带你简单理解函数式编程
话不多说 开始!
- 特性
1.   必须是接口
2.   必须只有唯一一个未实现方法
3.   必须注解@FunctionalInterface声明


我们常见的基础函数式接口有 comsumer、function、predicate、supplier、

我们以一台手机的从生产到销售为例,贯穿函数式编程
生产-> 质检 -> 包装 -> 销售


上代码

手机类

@Data
@AllArgsConstructor
public class Phone {

    /**
     * 手机编号
     */
    private Integer code;

    /**
     *  手机名称
     */
    private String name;

    /**
     *  手机质量
     */
    private boolean quality;

    /**
     *  手机版本
     */
    private String version;
}


```

包装类

@Data
@AllArgsConstructor
public class PhoneBox {

    /**
     *  手机
     */
    private Phone phone;

    /**
     * 证书
     */
    private String certificate;
}

生产线

 

public class ProductionLine {

    /**
     *  生产手机
     * @param supplier
     * @return
     */
    public Phone prodPhone(Supplier<Phone> supplier) {
        return supplier.get();
    }

    /**
     * 质量检测
     *
     * @param predicate
     * @param phone
     * @return
     */
    public boolean detection(Predicate<Phone> predicate, Phone phone) {
        return predicate.test(phone);
    }

    /**
     * 包装
     *
     * @param function
     * @param phone
     * @return
     */
    public PhoneBox packaging(Function<Phone, PhoneBox> function, Phone phone) {
        return function.apply(phone);
    }

    /**
     *  销售
     *
     * @param consumer
     * @param phoneBox
     */
    public void sell(Consumer<PhoneBox> consumer, PhoneBox phoneBox) {
        consumer.accept(phoneBox);
    }
}

测试类

```

public class Test {



    @org.junit.Test
    public void phoneLine() {
        ProductionLine productionLine = new ProductionLine();
        //  流水线存在质检和销售, 移除操作  需要使用安全List
        List<Phone> phoneList = new ArrayList<>();

        // 生产手机  Supplier
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            Phone phone = productionLine.prodPhone(() -> {
                System.out.println("生产手机===》编号:" + finalI);
                return new Phone(finalI, "iPhone13", finalI % 2 == 0, "V1.0");
            });
            phoneList.add(phone);
        }

        // 质检  Predicate
        //  Stream质检 phoneList = phoneList.stream().filter(Phone::isQuality).collect(Collectors.toList());
        // 遍历时移除 存在不安全操作, 所以这里使用普通for循环 便于操作List
        for (int i = 0; i < phoneList.size(); i++) {
            if (productionLine.detection(Phone::isQuality, phoneList.get(i))) {
                System.out.println("质检不合格手机===》编号:" + phoneList.get(i).getCode());
                phoneList.remove(i);
            }

        }
        // 包装 stream方式
        // List<PhoneBox> phoneBoxList = phoneList.stream().map(e -> new PhoneBox(e, "安全证书")).collect(Collectors.toList());

        List<PhoneBox> boxList = new ArrayList<>();
        phoneList.forEach(e -> {
            System.out.println("包装手机===》编号:" + e.getCode());
            PhoneBox phoneBox = productionLine.packaging(f -> new PhoneBox(e, "安全证书"), e);
            boxList.add(phoneBox);
        });

        // 销售 Stream方式
        // 遍历时移除 存在不安全操作, 所以这里使用普通for循环 便于操作List
        for (int i = 0; i < boxList.size(); i++) {
            productionLine.sell(f -> {
                System.out.println("卖出手机==》编号:" + f.getPhone().getCode());
            }, boxList.get(i));
        }
    }

}


```

执行结果

生产手机===》编号:0
生产手机===》编号:1
生产手机===》编号:2
生产手机===》编号:3
生产手机===》编号:4
生产手机===》编号:5
生产手机===》编号:6
生产手机===》编号:7
生产手机===》编号:8
生产手机===》编号:9
质检不合格手机===》编号:0
质检不合格手机===》编号:2
质检不合格手机===》编号:4
质检不合格手机===》编号:6
质检不合格手机===》编号:8
包装手机===》编号:1
包装手机===》编号:3
包装手机===》编号:5
包装手机===》编号:7
包装手机===》编号:9
卖出手机==》编号:1
卖出手机==》编号:3
卖出手机==》编号:5
卖出手机==》编号:7
卖出手机==》编号:9


 

上一篇:MySQL数据库唯一性设置unique index


下一篇:倒排索引