@FunctionalInterface
public 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 消费者
*/
@Deprecated
private synchronized <U> GenericConsumerBuilder<T> action(U consumerChange, BiConsumer<T, U>... consumerBehaviors) {
return action(consumerChange, consumerBehaviors);
}
/**
* 操作给定给定消费者的参数执行此操作
*
* @param consumerChange 消费者的改变
* @param <U> 给定消费者的改变
* @return 消费者
*/
@Deprecated
public 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();
}
}