文章来源:
angula
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至2384272385@qq.com举报,一经查实,本站将立刻删除。
面向对象编程是对数据的抽象,而函数式编程是对行为的一种抽象。
(一 ) java里提供的重要函数接口
函数接口 就是用java.lang.FunctionalInterface注解修饰的一个接口类。是一种语义上的定义。
平时工作中不需要自定义。java已经提供了挺多的了。
Predicate<T>:判断类型的函数接口,例如某人年龄是否大于18
Consumer<T>:消费类型的函数接口,例如 我们要输出一个值。
Supplier<T>:提供者。例如工厂方法。
还有其他的Function<T>、BinaryOperator<T>。这里我们使用Supplier<T>
(二)Supplier<T>
Supplier的代码如下。语义就是返回一个结果。
@FunctionalInterfacepublic interface Supplier<T> { /** * Gets a result. * * @return a result */ T get();}
(三) 实现复制list对象到另一个list对象
org.springframework.beans.BeanUtils 只有copyProperties(source,target) 对象到对象的复制。接下我们扩展 通过Suppiler 来实现list的复制。
代码如下
//继承 BeanUtilspublic 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 @AllArgsConstructor public static class Source{ private String name; private Integer age; } @Data public static class Target{ private String name; private Integer age; }}
运行 结果如下 符合预期
张三::13李四::14
函数式编程是java非常牛的功能。可以说是个装高手的利器,代码简洁明了。