Java编写的实体返回VO工具

好久不见 最近些许有点懒惰 程序员嘛 每个月总会有几天的 你懂得

那最近发现好的代码写出来真的会让人有种赏心悦目的存在 相反就会有一种想掐死写代码的那个人

所以我最近写了一个小工具 就是实体转换VO对象的一个小工具 说到这里 如果你的第一反应是 Spring的BeanUtils 那说明你肯定也有遇到过跟我一样的问题

那具体是怎么做? (不考虑性能的情况下) 等下分析

先看下如果正常返回VO我们需要怎么去操作?

现在有一个用户实体

import lombok.Data;

/**
 * 用户实体
 *
 * @author 是小张啊
 * @since 2021-05-06
 */
@Data
public class User {
    /**
     * 用户id
     */
    private String id;

    /**
     * 用户名称(账号)
     */
    private String name;

    /**
     * 密码(不加密)
     */
    private String password;
}

现在需要返回一个VO的对象 即

import lombok.Data;

/**
 * 用户vo对象
 * @author 是小张啊
 * @since 2021-05-06
 */
@Data
public class UserVo {
    /**
     * 用户id
     */
    private String id;

    /**
     * 用户名称(账号)
     */
    private String name;
}

可以这样处理

import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 是小张啊
 * @since 2021-05-06
 */
@RestController
public class UserController {

    /**
     * 查询用户
     * @return
     */
    @GetMapping("/select")
    public UserVo select() {
        User user = new User();
        user.setId(1);
        user.setName("是小张啊");
        UserVo userVo = new UserVo();
        BeanUtils.copyProperties(user, userVo);
        return userVo;
    }
}

这样是没有问题的 不谈性能 这样做是非常稳的

现在有这样的一个需求 需要返回一个 List<UserVo> 如果你能想到用 java8的lambda表达式的去使用Spring的BeanUtils 那也是不错的
具体实现就是

import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 是小张啊
 * @since 2021-05-06
 */
@RestController
public class UserController {

    /**
     * 查询用户
     * @return
     */
    public List<UserVo> select() {
        // 初始化数据
        User user1 = new User();
        user1.setId(1);
        user1.setName("是小张啊");
        User user2 = new User();
        user2.setId(1);
        user2.setName("是小张啊");
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);

        // List<entity> -> List<vo>
        List<UserVo> userVos = users.stream().map(user -> {
            UserVo userVo = new UserVo();
            BeanUtils.copyProperties(user, userVo);
            return userVo;
        }).collect(Collectors.toList());
        return userVos;
    }

}

这其实也挺不错的 只是每次都这样写 属实不美观 如果能提取公共方法去调用就太舒服了 所以这个方法也是根据 BeanUtils去优化这个工具

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Bean 工具类
 * @author 是小张啊
 * @since 2021-05-06
 */
@Slf4j
public class Utils extends BeanUtils {

    /**
     * 将实体批量转换成 vo对象
     * 注:当前只针对 List
     *
     * @param source 实体集合
     * @param clazz  需要批量转换成的对象
     * @param <T>
     * @param <S>
     * @return
     */
    @SneakyThrows
    public static <T, S> List<T> conversionVo(List<S> source, Class<T> clazz) {
        return source.stream().map(resources -> {
            T t = null;
            try {
                // 利用反射 创建一个新的实例
                t = clazz.newInstance();
                BeanUtils.copyProperties(resources, t);
            } catch (InstantiationException e) {
                log.info("{}实例化失败", clazz);
            } catch (IllegalAccessException e) {
                log.info("{}不可访问", clazz);
            }
            return t;
        }).collect(Collectors.toList());
    }
}

这样就很方便 只需要去调用即可

import top.lzmvlog.common.Utils;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 是小张啊
 * @since 2021-05-06
 */
@RestController
public class UserController {

    /**
     * 查询用户
     * @return
     */
    public List<UserVo> select() {
        // 初始化数据
        User user1 = new User();
        user1.setId(1);
        user1.setName("是小张啊");
        User user2 = new User();
        user2.setId(1);
        user2.setName("是小张啊");
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        List<UserVo> userVos = Utils.conversionVo(users, UserVo.class);
        return userVos;
    }

}

BeanUtils 是有局限性的 你必须保证 实体的字段值和返回的VO字段值是一样的

代码写到最后 其实就是一个不断优化的过程 领导来了 不能多说 得继续搬砖去了

以上就是Java编写的实体返回VO工具的详细内容,更多关于Java 实体返回VO工具的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java Volatile应用单例模式实现过程解析

    单例模式 回顾一下,单线程下的单例模式代码 饿汉式 构造器私有化 自行创建,并且用静态变量保存static 向外提供这个实例 public 强调这是一个单例,用final public class sington(){ public final static INSTANCE = new singleton(); private singleton(){} } 第二种:jdk1.5之后用枚举类型 枚举类型:表示该类型的对象是有限的几个 我们可以限定为1个,就称了单例 public enum Si

  • Java并发编程——volatile关键字

    一.volatile是什么 volatile是Java并发编程中重要的一个关键字,被比喻为"轻量级的synchronized",与synchronized不同的是,volatile只能修饰变量,无法修饰方法及代码块等. 下面是使用volatile关键字实现的单例模式: public class Singleton implements Serializable { private static volatile Singleton singleton; private Singleto

  • 谈谈对Java中的volatile的理解

    前言 volatile相关的知识其实自己一直都是有掌握的,能大概讲出一些知识,例如:它可以保证可见性:禁止指令重排.这两个特性张口就来,但要再往深了问,具体是如何实现这两个特性的,以及在什么场景下使用volatile,为什么不直接用synchronized这种深入和扩展相关的问题,就回答的不好了.因为volatile是面试必问的知识,所以这次准备把这部分知识也给啃掉. 系统处理效率与Java内存模型 在计算机中,每条程序指令都是在CPU中执行的,而CPU执行指令的数据都是临时存储在内存中的,但是

  • Java多线程volatile原理及用法解析

    首先volatile有两大功能: 保证线程可见性 禁止指令重排序 1.保证线程可见性 首先我们来看这样一个程序,其中不加volatile关键字运行的结果截然不同,加上volatile程序能够正常结束,不加则程序进入死循环: package com.designmodal.design.juc01; import java.util.concurrent.TimeUnit; /** * @author D-L * @Classname T001_volatile * @Version 1.0 *

  • Java使用DualPivotQuicksort排序

    Java排序 - DualPivotQuicksort 这里描述 leftmost = true 的情况,也就是会从数组的开始一直排序到数组的结尾. 数组类型:int[].long[].short[].char[].float[].double[],还有比较特殊的 byte[] 1. 插入排序(insertion sort) 适合长度短的数组排序,对于byte[] 长度小于等于30 和 其它数组长度小于47 的情况,会使用这种排序 代码以 int[] a 为例: // 第一次循环i=j=0,之后

  • Java volatile如何实现禁止指令重排

    计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种: 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 -> 最终执行指令 单线程环境里面确保最终执行结果和代码顺序的结果一致 处理器在进行重排序时,必须要考虑指令之间的数据依赖性 多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测. 指令重排 - example 1 public void mySort() { i

  • java实现相同属性名称及相似类型的pojo、dto、vo等互转操作

    已应用于实际项目: 1.thrift对象与dto之间的互转 2.pojo与dto之间的互转 3.pojo与vo之间的互转 1.核心转换工具类,对特别复杂类型不做处理,因为业务场景还未覆盖 package littlehow.convert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Method; import

  • Java中多线程与并发_volatile关键字的深入理解

    一.volatile关键字 volatile是JVM提供的一种轻量级的同步机制,特性: 1.保证内存可见性 2.不保证原子性 3.防止指令重排序 二.JMM(Java Memory Model) Java内存模型中规定了所有的变量都存储在主内存中(如虚拟机物理内存中的一部分),每条线程还有自己的工作内存(如CPU中的高速缓存),线程的工作内存中保存了该线程使用到的变量到主内存的副本拷贝,线程对变量的所有操作(读取.赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量.不同线程之间无法直接访

  • Java Method类及invoke方法原理解析

    在说Method和invoke的使用之前我们来看一个小例子, 如果看懂了那就ok了 public class MethodInvoke { class Animal { public void print() { System.out.println("Animal.print()"); } } class Cat extends Animal { @Override public void print() { System.out.println("Cat.print()&

  • JAVA并发中VOLATILE关键字的神奇之处详解

    并发编程中的三个概念: 1.原子性 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行. 2.可见性 对于可见性,Java提供了volatile关键字来保证可见性. 当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值. 而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保

  • java中volatile关键字的作用与实例代码

    一,什么是volatile关键字,作用是什么 volatile是java虚拟机提供的轻量级同步机制 ​ 作用是: 1.保证可见性 2.禁止指令重排 3.不保证原子性 本篇具体就讲解 什么叫保证了可见性, 什么叫禁止指令重排,什么是原子性 而在这之前需要对JMM 有所了解 二,什么是JMM ​ JMM(java 内存模型 Java Memory Model 简称JMM) 本身是一个抽象的概念,并不在内存中真实存在的,它描述的是一组规范或者规则,通过这组规范定义了程序中各个变量(实例字段,静态字段和

随机推荐