@FunctionalInterfacepublic interface Consumer<T> {void accept(T t);default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}}
核心方法如下:
- void accept(T t);
- 给定对象的参数T执行定义的操作
- default Consumer andThen(Consumer<? super T> after)
package com.chihiro.jdk8.feature.functional_interface;import com.chihiro.jdk8.feature.MonitorUtil;import com.chihiro.jdk8.feature.entity.Dummy;import com.chihiro.jdk8.feature.entity.Student;import java.util.*;import java.util.concurrent.CopyOnWriteArrayList;import java.util.function.BiConsumer;import java.util.function.Consumer;import java.util.function.Supplier;/*** @author WeiHaiChao* @description: 通用消费者构造实现* @createDate 2021-08-02 1:46**/public class GenericConsumerBuilder<T> {/*** 消费者实例*/private final Supplier<T> instantiate;/*** 存储消费者每一个行为*/private final List<Consumer<T>> consumers = new CopyOnWriteArrayList<>();/*** 构造函数实例化 消费者实例** @param instantiate 消费者实例*/public GenericConsumerBuilder(Supplier<T> instantiate) {this.instantiate = instantiate;}/*** @param instantiate 消费者实例* @param <T> 消费者类型* @return 实例对象*/public synchronized static <T> GenericConsumerBuilder<T> of(T instantiate) {return new GenericConsumerBuilder<>(() -> instantiate);}/*** @param instantiate 消费者实例* @param <T> 消费者类型* @return 实例对象*/public synchronized static <T> GenericConsumerBuilder<T> of(Supplier<T> instantiate) {return new GenericConsumerBuilder<>(instantiate);}/*** 操作给定给定消费者的参数执行此操作** @param consumerBehavior 消费者的行为* @param consumerChange 消费者的改变* @param <U> 给定消费者的改变* @return 消费者*/public synchronized <U> GenericConsumerBuilder<T> action(U consumerChange, BiConsumer<T, U> consumerBehavior) {Consumer<T> setOperationFunction = instance -> consumerBehavior.accept(instance, consumerChange);consumers.add(setOperationFunction);return this;}/*** 操作给定给定消费者的参数执行此操作* 并不实用** @param consumerBehaviors 消费者的改变* @param <U> 给定消费者的改变* @return 消费者*/@Deprecatedprivate synchronized <U> GenericConsumerBuilder<T> action(U consumerChange, BiConsumer<T, U>... consumerBehaviors) {return action(consumerChange, consumerBehaviors);}/*** 操作给定给定消费者的参数执行此操作** @param consumerChange 消费者的改变* @param <U> 给定消费者的改变* @return 消费者*/@Deprecatedpublic synchronized <U> GenericConsumerBuilder<T> action(U consumerChange, BiConsumer<T, U> consumerBehavior1, BiConsumer<T, U> consumerBehavior2) {Consumer<T> setOperationFunction = null;List<BiConsumer<T, U>> consumerList = Arrays.asList(consumerBehavior1, consumerBehavior2);BiConsumer<T, U> consumer = consumerList.get(0);for (int i = 1; i < consumerList.size(); i++) {BiConsumer<T, U> tuBiConsumer = consumerList.get(i);setOperationFunction = instance -> consumer.andThen(tuBiConsumer).accept(instance, consumerChange);}consumers.add(setOperationFunction);return this;}/*** 建立改变行为后的供给型消费者** @return 变更的消费者*/public synchronized T build() {T instance = instantiate.get();consumers.forEach(data -> data.accept(instance));consumers.clear();return instance;}/*** 建立改变行为后的消费者** @return 变更的消费者*/public synchronized Optional<T> newBuild() {T instance = instantiate.get();consumers.forEach(data -> data.accept(instance));consumers.clear();return Optional.ofNullable(instance);}/*** 建立改变行为后的消费者** @param instanceSupplier 供给型消费者实例* @return 变更的消费者* @throws ToolException 实例为空*/public synchronized T build(Supplier<T> instanceSupplier) throws ToolException {T instance = SupplierTool.resolve(instanceSupplier).orElseThrow(() -> new ToolException("instance not null"));consumers.forEach(data -> data.accept(instance));consumers.clear();return instance;}/*** 建立改变行为后的供给型消费者** @param instanceSupplier 供给型消费者实例* @return 变更的消费者* @throws ToolException 实例为空*/public synchronized Optional<T> newBuild(Supplier<T> instanceSupplier) throws ToolException {T instance = SupplierTool.resolve(instanceSupplier).orElseThrow(() -> new ToolException("instance not null"));consumers.forEach(data -> data.accept(instance));consumers.clear();return Optional.ofNullable(instance);}private static void testLombokBuilder() {MonitorUtil.start();List<Student> studentList = new ArrayList<>();for (int i = 0; i < 999999; i++) {Student student = Student.builder().age(i).name("sutnde" + i).a(i).b(i).c(i).d(i).e(i).f(i).g(i).h(i).i(i).j(i).k(i).build();studentList.add(student);}MonitorUtil.finish();}private static void testGenericConsumerBuilder() {MonitorUtil.start();List<Dummy> dummys = new ArrayList<>();for (int i = 0; i < 999999; i++) {Dummy dummy = GenericConsumerBuilder.of(Dummy::new).action("dummy" + i, Dummy::setName).action(i, Dummy::setAge).build();dummys.add(dummy);}MonitorUtil.finish();}/*** test :* lombok Builder 1:耗时1902ms 2:耗时1791ms 3:耗时1910ms 4: 耗时1907ms 5:耗时1837ms* GenericConsumerBuilder LinkedList 1:耗时2107ms 2:耗时2154ms 3:耗时2759ms 4: 耗时2221ms 5:耗时2274ms* GenericConsumerBuilder ArrayList 1:耗时2552ms 2:耗时2559ms 3:耗时2589ms 4: 耗时2541ms 5:耗时2615ms* GenericConsumerBuilder Vector 1:耗时2498ms 2:耗时2535ms 3:耗时2503ms 4: 耗时2563ms 5:时2584ms* GenericConsumerBuilder CopyOnWriteArrayList 1:耗时2080ms 2:耗时2095ms 3:耗时2053ms 4: 耗时2073ms 5:耗时2096ms*/public static void main(String[] args) {// testGenericConsumerBuilder();// testLombokBuilder();// Optional<Dummy> dummyOptional = GenericConsumerBuilder.of(Dummy::new)// .action("23", Dummy::setName)// .action(112, Dummy::setAge)// .newBuild();}}
