您的位置 首页 java

java函数式编程-通过Supplier实现复制list对象到另一个list对象

面向对象编程是对数据的抽象,而 函数式编程 是对行为的一种抽象。

(一 ) java 里提供的重要函数接口

函数接口 就是用 java.lang .FunctionalInterface注解修饰的一个接口类。是一种语义上的定义。

平时工作中不需要自定义。java已经提供了挺多的了。

Predicate<T>:判断类型的函数接口,例如某人年龄是否大于18

Consumer<T>: 消费类型 的函数接口,例如 我们要输出一个值。

Supplier<T>:提供者。例如工厂方法。

还有其他的 Function <T>、BinaryOperator<T>。这里我们使用Supplier<T>

(二)Supplier<T>

Supplier的代码如下。语义就是返回一个结果。

 @FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}  

(三) 实现复制list对象到另一个list对象

org.springframework.beans.BeanUtils 只有 copy Properties(source,target) 对象到对象的复制。接下我们扩展 通过Suppiler 来实现list的复制。

代码如下

 //继承 BeanUtils
public class MyBeanUtils  extends  BeanUtils {
    /**
     *通用的方式 所以用了 泛型 。
     * @param sourceList  原list数据
     * @param supplier  目标对象 提供者。
     * @param <S>  泛型 代指 source的类型
     * @param <T>  泛型 代指 target的类型
     * @return
     */
    public  static  <S,T> List<T> copyPropertiesList(List<S> sourceList, Supplier<T> supplier){
        List<T> targetList = new ArrayList<>(sourceList.size());
        sourceList.forEach(source->{
            //通过supplier获取对象。
            T target = supplier.get();
            //调用BeanUtils自带的方法 复制。
            copyProperties(source,target);
            targetList.add(target);
        });
        return targetList;
    }
}  

测试类

 public class Test {
    public static  void  main(String[] args) {
        //构造测试数据
        List<Source> sourceList = new ArrayList<>();
        sourceList.add(new Source("张三",13));
        sourceList.add(new Source("李四",14));
        //Target::new 就是一种supplier函数,每调用一次suppiler的get方法就新建一个对象。
        List<Target> result = MyBeanUtils.copyPropertiesList(sourceList,Target::new);
       result.forEach(target ->System.out.println(target.getName()+"::"+target.getAge()));

    }
    @Data
    @AllArgs Constructor 
    public static class Source{
         private  String name;
        private Integer age;
    }

    @Data
    public static class Target{
        private String name;
        private Integer age;
    }

}  

运行 结果如下 符合预期

 张三::13
李四::14  

函数式编程是java非常牛的功能。可以说是个装高手的利器,代码简洁明了。

文章来源:智云一二三科技

文章标题:java函数式编程-通过Supplier实现复制list对象到另一个list对象

文章地址:https://www.zhihuclub.com/197084.shtml

关于作者: 智云科技

热门文章

网站地图