新增对象工具类

builder.class

package com.xqm.jdk8.fun;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * 通用的 Builder 模式构建器
 */
public class Builder<T> {
    private final Supplier<T> instantiator;
    private List<Consumer<T>> modifiers = new ArrayList<>();
    private Builder(Supplier<T> instantiator) {
        this.instantiator = instantiator;
    }
    public static <T> Builder<T> of(Supplier<T> instantiator) {
        return new Builder<>(instantiator);
    }
    public <P1> Builder<T> with(Consumer1<T, P1> consumer, P1 p1) {
        Consumer<T> c = instance -> consumer.accept(instance, p1);
        modifiers.add(c);
        return this;
    }
    public <P1, P2> Builder<T> with(Consumer2<T, P1, P2> consumer, P1 p1, P2 p2) {
        Consumer<T> c = instance -> consumer.accept(instance, p1, p2);
        modifiers.add(c);
        return this;
    }
    public <P1, P2, P3> Builder<T> with(Consumer3<T, P1, P2, P3> consumer, P1 p1, P2 p2, P3 p3) {
        Consumer<T> c = instance -> consumer.accept(instance, p1, p2, p3);
        modifiers.add(c);
        return this;
    }
    public T build() {
        T value = instantiator.get();
        modifiers.forEach(modifier -> modifier.accept(value));
        modifiers.clear();
        return value;
    }
    /**
     * 1 参数 Consumer
     */
    @FunctionalInterface
    public interface Consumer1<T, P1> {
        void accept(T t, P1 p1);
    }
    /**
     * 2 参数 Consumer
     */
    @FunctionalInterface
    public interface Consumer2<T, P1, P2> {
        void accept(T t, P1 p1, P2 p2);
    }
    /**
     * 3 参数 Consumer
     */
    @FunctionalInterface
    public interface Consumer3<T, P1, P2, P3> {
        void accept(T t, P1 p1, P2 p2, P3 p3);
    }
}

Person.class

package com.xqm.jdk8.builder;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
    private List<String> son;
    private Map<String,Integer> sonInfo;


    public void addSonList(String sonName){
        this.son=Optional.ofNullable(this.son).orElse(new ArrayList<>());
        this.son.add(sonName);
    }


    public void addSonInfoMap(String sonName,Integer sonAge){
        this.sonInfo=Optional.ofNullable(this.sonInfo).orElse(new HashMap<>());
        this.sonInfo.put(sonName,sonAge);
    }
}

BuilderTest.class

package com.xqm.jdk8.builder;

public class BuilterTest {
    public static void main(String[] args) {
        Person person=Builder.of(Person::new)
                .with(Person::setName,"张三")
                .with(Person::setAge,27)
                .with(Person::addSonList,"son1")
                .with(Person::addSonList,"son2")
                .with(Person::addSonInfoMap,"son1",24)
                .with(Person::addSonInfoMap,"son2",18)
                .build();
        // Person(name=张三, age=27, son=[son1, son2], sonInfo={son2=18, son1=24})
        System.out.println(person);
    }
}