// Path: src/main/java/com/github/trang/copiers/Copiers.java
// public final class Copiers {
// 
//     private Copiers() {
//         throw new UnsupportedOperationException();
//     }
// 
//     /**
//      * 基于 Orika 实现的简单拷贝，满足基本需求
//      *
//      * @param sourceClass 源对象类型
//      * @param targetClass 目标对象类型
//      * @return copier
//      */
//     public static <F, T> Copier<F, T> create(Class<F> sourceClass, Class<T> targetClass) {
//         return CopierFactory.getOrCreateOrikaCopier(sourceClass, targetClass);
//     }
// 
//     /**
//      * 基于 Orika 实现的高级拷贝，满足复杂需求
//      *
//      * @param sourceClass 源对象类型
//      * @param targetClass 目标对象类型
//      * @return copier
//      */
//     public static <F, T> OrikaCopier.Builder<F, T> createOrika(Class<F> sourceClass, Class<T> targetClass) {
//         return new OrikaCopier.Builder<>(sourceClass, targetClass);
//     }
// 
//     /**
//      * 基于 Cglib 实现的拷贝，不支持 Converter
//      *
//      * @param sourceClass 源对象类型
//      * @param targetClass 目标对象类型
//      * @return copier
//      */
//     public static <F, T> Copier<F, T> createCglib(Class<F> sourceClass, Class<T> targetClass) {
//         return CopierFactory.getOrCreateCglibCopier(sourceClass, targetClass);
//     }
// 
//     /**
//      * 基于 Cglib 实现的拷贝，支持 Converter
//      *
//      * @param sourceClass 源对象类型
//      * @param targetClass 目标对象类型
//      * @param converter   转换器
//      * @return copier
//      */
//     public static <F, T> Copier<F, T> createCglib(Class<F> sourceClass, Class<T> targetClass, Converter converter) {
//         return CopierFactory.getOrCreateCglibCopier(sourceClass, targetClass, converter);
//     }
// 
// }
// 
// Path: src/main/java/com/github/trang/copiers/base/Copier.java
// public interface Copier<F, T> extends BeanCopier<F, T>, ArrayCopier<F, T>, ListCopier<F, T>, SetCopier<F, T> {
// 
// }
// 
// Path: src/test/java/com/github/trang/copiers/test/bean/SimpleSource.java
// @Getter
// @Setter
// @ToString
// public class SimpleSource {
// 
//     private Integer id;
//     private Long time;
//     private List<Integer> statusList;
//     private List<Double> typeList;
//     private Map<String, Object> map;
//     private String same;
// 
// //    public SimpleSource() {
// //    }
// 
//     public SimpleSource(Integer id) {
//         this.id = id;
//     }
// 
//     public SimpleSource(Integer id, Long time) {
//         this.id = id;
//         this.time = time;
//     }
// 
// }
// 
// Path: src/test/java/com/github/trang/copiers/test/bean/SimpleTarget.java
// @Getter
// @Setter
// @ToString
// public class SimpleTarget {
// 
//     private String id;
//     private Date time;
//     private String statuses;
//     private String types;
//     private String name;
//     private String same;
// 
// //    public SimpleTarget() {
// //    }
// 
//     public SimpleTarget(String id) {
//         this.id = id;
//     }
// 
//     public SimpleTarget(Date time) {
//         this.time = time;
//     }
// 
//     public SimpleTarget(String id, Date time) {
//         this.id = id;
//         this.time = time;
//     }
// 
// }


import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import org.junit.Test;
import com.github.trang.copiers.Copiers;
import com.github.trang.copiers.base.Copier;
import com.github.trang.copiers.test.bean.SimpleSource;
import com.github.trang.copiers.test.bean.SimpleTarget;
import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;
        stopwatch.reset().start();
        sourceList.stream().parallel().map(copier::copy).forEachOrdered(targetList3::add);
        log.info("多线程 Ordered 耗时: {}ms, 大小: {}", stopwatch.elapsed(TimeUnit.MILLISECONDS), targetList3.size());
    }

    @Test
    public void concurrentMap() {
        ConcurrentHashMap<Object, Object> map = new ConcurrentHashMap<>();
        map.computeIfAbsent("A", key -> value());
        map.computeIfAbsent("A", key -> value());
        map.computeIfAbsent("B", key -> value());
        System.out.println(map.size());
    }

    private Object value() {
        System.out.println("---");
        return "VALUE";
    }

    @Test
    public void from() {
        Optional.of(Arrays.asList(null,1.1,2.22,3.333,4.4444,5.55555))
                .filter(list -> !list.isEmpty())
                .map(list -> list.stream()
                        .filter(Objects::nonNull)
                        .map(Objects::toString)
                        .collect(joining(",")))
                .ifPresent(System.out::println);
    }

// Path: src/main/java/com/github/trang/copiers/Copiers.java
// public final class Copiers {
// 
//     private Copiers() {
//         throw new UnsupportedOperationException();
//     }
// 
//     /**
//      * 基于 Orika 实现的简单拷贝，满足基本需求
//      *
//      * @param sourceClass 源对象类型
//      * @param targetClass 目标对象类型
//      * @return copier
//      */
//     public static <F, T> Copier<F, T> create(Class<F> sourceClass, Class<T> targetClass) {
//         return CopierFactory.getOrCreateOrikaCopier(sourceClass, targetClass);
//     }
// 
//     /**
//      * 基于 Orika 实现的高级拷贝，满足复杂需求
//      *
//      * @param sourceClass 源对象类型
//      * @param targetClass 目标对象类型
//      * @return copier
//      */
//     public static <F, T> OrikaCopier.Builder<F, T> createOrika(Class<F> sourceClass, Class<T> targetClass) {
//         return new OrikaCopier.Builder<>(sourceClass, targetClass);
//     }
// 
//     /**
//      * 基于 Cglib 实现的拷贝，不支持 Converter
//      *
//      * @param sourceClass 源对象类型
//      * @param targetClass 目标对象类型
//      * @return copier
//      */
//     public static <F, T> Copier<F, T> createCglib(Class<F> sourceClass, Class<T> targetClass) {
//         return CopierFactory.getOrCreateCglibCopier(sourceClass, targetClass);
//     }
// 
//     /**
//      * 基于 Cglib 实现的拷贝，支持 Converter
//      *
//      * @param sourceClass 源对象类型
//      * @param targetClass 目标对象类型
//      * @param converter   转换器
//      * @return copier
//      */
//     public static <F, T> Copier<F, T> createCglib(Class<F> sourceClass, Class<T> targetClass, Converter converter) {
//         return CopierFactory.getOrCreateCglibCopier(sourceClass, targetClass, converter);
//     }
// 
// }
// 
// Path: src/main/java/com/github/trang/copiers/base/Copier.java
// public interface Copier<F, T> extends BeanCopier<F, T>, ArrayCopier<F, T>, ListCopier<F, T>, SetCopier<F, T> {
// 
// }
// 
// Path: src/test/java/com/github/trang/copiers/test/bean/SimpleSource.java
// @Getter
// @Setter
// @ToString
// public class SimpleSource {
// 
//     private Integer id;
//     private Long time;
//     private List<Integer> statusList;
//     private List<Double> typeList;
//     private Map<String, Object> map;
//     private String same;
// 
// //    public SimpleSource() {
// //    }
// 
//     public SimpleSource(Integer id) {
//         this.id = id;
//     }
// 
//     public SimpleSource(Integer id, Long time) {
//         this.id = id;
//         this.time = time;
//     }
// 
// }
// 
// Path: src/test/java/com/github/trang/copiers/test/bean/SimpleTarget.java
// @Getter
// @Setter
// @ToString
// public class SimpleTarget {
// 
//     private String id;
//     private Date time;
//     private String statuses;
//     private String types;
//     private String name;
//     private String same;
// 
// //    public SimpleTarget() {
// //    }
// 
//     public SimpleTarget(String id) {
//         this.id = id;
//     }
// 
//     public SimpleTarget(Date time) {
//         this.time = time;
//     }
// 
//     public SimpleTarget(String id, Date time) {
//         this.id = id;
//         this.time = time;
//     }
// 
// }


// Path: src/test/java/com/github/trang/copiers/test/benchmark/Java8Test.java
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import org.junit.Test;
import com.github.trang.copiers.Copiers;
import com.github.trang.copiers.base.Copier;
import com.github.trang.copiers.test.bean.SimpleSource;
import com.github.trang.copiers.test.bean.SimpleTarget;
import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;

        stopwatch.reset().start();
        sourceList.stream().parallel().map(copier::copy).forEachOrdered(targetList3::add);
        log.info("多线程 Ordered 耗时: {}ms, 大小: {}", stopwatch.elapsed(TimeUnit.MILLISECONDS), targetList3.size());
    }

    @Test
    public void concurrentMap() {
        ConcurrentHashMap<Object, Object> map = new ConcurrentHashMap<>();
        map.computeIfAbsent("A", key -> value());
        map.computeIfAbsent("A", key -> value());
        map.computeIfAbsent("B", key -> value());
        System.out.println(map.size());
    }

    private Object value() {
        System.out.println("---");
        return "VALUE";
    }

    @Test
    public void from() {
        Optional.of(Arrays.asList(null,1.1,2.22,3.333,4.4444,5.55555))
                .filter(list -> !list.isEmpty())
                .map(list -> list.stream()
                        .filter(Objects::nonNull)
                        .map(Objects::toString)
                        .collect(joining(",")))
                .ifPresent(System.out::println);
    }

    @Test