1. @FunctionalInterface
  2. public interface Consumer<T> {
  3. void accept(T t);
  4. default Consumer<T> andThen(Consumer<? super T> after) {
  5. Objects.requireNonNull(after);
  6. return (T t) -> { accept(t); after.accept(t); };
  7. }
  8. }

核心方法如下:

  • void accept(T t);
    • 给定对象的参数T执行定义的操作
  • default Consumer andThen(Consumer<? super T> after)
    • 对给定的参数T执行定义的操作执行再继续执行after定义的操作

      设计消费者类构造

      虽然比不上lombok @Builder 性能好, 但是差距不大。

  1. package com.chihiro.jdk8.feature.functional_interface;
  2. import com.chihiro.jdk8.feature.MonitorUtil;
  3. import com.chihiro.jdk8.feature.entity.Dummy;
  4. import com.chihiro.jdk8.feature.entity.Student;
  5. import java.util.*;
  6. import java.util.concurrent.CopyOnWriteArrayList;
  7. import java.util.function.BiConsumer;
  8. import java.util.function.Consumer;
  9. import java.util.function.Supplier;
  10. /**
  11. * @author WeiHaiChao
  12. * @description: 通用消费者构造实现
  13. * @createDate 2021-08-02 1:46
  14. **/
  15. public class GenericConsumerBuilder<T> {
  16. /**
  17. * 消费者实例
  18. */
  19. private final Supplier<T> instantiate;
  20. /**
  21. * 存储消费者每一个行为
  22. */
  23. private final List<Consumer<T>> consumers = new CopyOnWriteArrayList<>();
  24. /**
  25. * 构造函数实例化 消费者实例
  26. *
  27. * @param instantiate 消费者实例
  28. */
  29. public GenericConsumerBuilder(Supplier<T> instantiate) {
  30. this.instantiate = instantiate;
  31. }
  32. /**
  33. * @param instantiate 消费者实例
  34. * @param <T> 消费者类型
  35. * @return 实例对象
  36. */
  37. public synchronized static <T> GenericConsumerBuilder<T> of(T instantiate) {
  38. return new GenericConsumerBuilder<>(() -> instantiate);
  39. }
  40. /**
  41. * @param instantiate 消费者实例
  42. * @param <T> 消费者类型
  43. * @return 实例对象
  44. */
  45. public synchronized static <T> GenericConsumerBuilder<T> of(Supplier<T> instantiate) {
  46. return new GenericConsumerBuilder<>(instantiate);
  47. }
  48. /**
  49. * 操作给定给定消费者的参数执行此操作
  50. *
  51. * @param consumerBehavior 消费者的行为
  52. * @param consumerChange 消费者的改变
  53. * @param <U> 给定消费者的改变
  54. * @return 消费者
  55. */
  56. public synchronized <U> GenericConsumerBuilder<T> action(U consumerChange, BiConsumer<T, U> consumerBehavior) {
  57. Consumer<T> setOperationFunction = instance -> consumerBehavior.accept(instance, consumerChange);
  58. consumers.add(setOperationFunction);
  59. return this;
  60. }
  61. /**
  62. * 操作给定给定消费者的参数执行此操作
  63. * 并不实用
  64. *
  65. * @param consumerBehaviors 消费者的改变
  66. * @param <U> 给定消费者的改变
  67. * @return 消费者
  68. */
  69. @Deprecated
  70. private synchronized <U> GenericConsumerBuilder<T> action(U consumerChange, BiConsumer<T, U>... consumerBehaviors) {
  71. return action(consumerChange, consumerBehaviors);
  72. }
  73. /**
  74. * 操作给定给定消费者的参数执行此操作
  75. *
  76. * @param consumerChange 消费者的改变
  77. * @param <U> 给定消费者的改变
  78. * @return 消费者
  79. */
  80. @Deprecated
  81. public synchronized <U> GenericConsumerBuilder<T> action(U consumerChange, BiConsumer<T, U> consumerBehavior1, BiConsumer<T, U> consumerBehavior2) {
  82. Consumer<T> setOperationFunction = null;
  83. List<BiConsumer<T, U>> consumerList = Arrays.asList(consumerBehavior1, consumerBehavior2);
  84. BiConsumer<T, U> consumer = consumerList.get(0);
  85. for (int i = 1; i < consumerList.size(); i++) {
  86. BiConsumer<T, U> tuBiConsumer = consumerList.get(i);
  87. setOperationFunction = instance -> consumer.andThen(tuBiConsumer).accept(instance, consumerChange);
  88. }
  89. consumers.add(setOperationFunction);
  90. return this;
  91. }
  92. /**
  93. * 建立改变行为后的供给型消费者
  94. *
  95. * @return 变更的消费者
  96. */
  97. public synchronized T build() {
  98. T instance = instantiate.get();
  99. consumers.forEach(data -> data.accept(instance));
  100. consumers.clear();
  101. return instance;
  102. }
  103. /**
  104. * 建立改变行为后的消费者
  105. *
  106. * @return 变更的消费者
  107. */
  108. public synchronized Optional<T> newBuild() {
  109. T instance = instantiate.get();
  110. consumers.forEach(data -> data.accept(instance));
  111. consumers.clear();
  112. return Optional.ofNullable(instance);
  113. }
  114. /**
  115. * 建立改变行为后的消费者
  116. *
  117. * @param instanceSupplier 供给型消费者实例
  118. * @return 变更的消费者
  119. * @throws ToolException 实例为空
  120. */
  121. public synchronized T build(Supplier<T> instanceSupplier) throws ToolException {
  122. T instance = SupplierTool.resolve(instanceSupplier).orElseThrow(() -> new ToolException("instance not null"));
  123. consumers.forEach(data -> data.accept(instance));
  124. consumers.clear();
  125. return instance;
  126. }
  127. /**
  128. * 建立改变行为后的供给型消费者
  129. *
  130. * @param instanceSupplier 供给型消费者实例
  131. * @return 变更的消费者
  132. * @throws ToolException 实例为空
  133. */
  134. public synchronized Optional<T> newBuild(Supplier<T> instanceSupplier) throws ToolException {
  135. T instance = SupplierTool.resolve(instanceSupplier).orElseThrow(() -> new ToolException("instance not null"));
  136. consumers.forEach(data -> data.accept(instance));
  137. consumers.clear();
  138. return Optional.ofNullable(instance);
  139. }
  140. private static void testLombokBuilder() {
  141. MonitorUtil.start();
  142. List<Student> studentList = new ArrayList<>();
  143. for (int i = 0; i < 999999; i++) {
  144. Student student = Student.builder().age(i).name("sutnde" + i)
  145. .a(i).b(i).c(i).d(i).e(i).f(i).g(i).h(i).i(i).j(i).k(i)
  146. .build();
  147. studentList.add(student);
  148. }
  149. MonitorUtil.finish();
  150. }
  151. private static void testGenericConsumerBuilder() {
  152. MonitorUtil.start();
  153. List<Dummy> dummys = new ArrayList<>();
  154. for (int i = 0; i < 999999; i++) {
  155. Dummy dummy = GenericConsumerBuilder.of(Dummy::new)
  156. .action("dummy" + i, Dummy::setName)
  157. .action(i, Dummy::setAge)
  158. .build();
  159. dummys.add(dummy);
  160. }
  161. MonitorUtil.finish();
  162. }
  163. /**
  164. * test :
  165. * lombok Builder 1:耗时1902ms 2:耗时1791ms 3:耗时1910ms 4: 耗时1907ms 5:耗时1837ms
  166. * GenericConsumerBuilder LinkedList 1:耗时2107ms 2:耗时2154ms 3:耗时2759ms 4: 耗时2221ms 5:耗时2274ms
  167. * GenericConsumerBuilder ArrayList 1:耗时2552ms 2:耗时2559ms 3:耗时2589ms 4: 耗时2541ms 5:耗时2615ms
  168. * GenericConsumerBuilder Vector 1:耗时2498ms 2:耗时2535ms 3:耗时2503ms 4: 耗时2563ms 5:时2584ms
  169. * GenericConsumerBuilder CopyOnWriteArrayList 1:耗时2080ms 2:耗时2095ms 3:耗时2053ms 4: 耗时2073ms 5:耗时2096ms
  170. */
  171. public static void main(String[] args) {
  172. // testGenericConsumerBuilder();
  173. // testLombokBuilder();
  174. // Optional<Dummy> dummyOptional = GenericConsumerBuilder.of(Dummy::new)
  175. // .action("23", Dummy::setName)
  176. // .action(112, Dummy::setAge)
  177. // .newBuild();
  178. }
  179. }