获取对象List某一属性值得集合

朝花夕拾 专栏收录该内容
4 篇文章 0 订阅

       工作中,难免在重复的做一些事情,查询数据。eg:销售主订单sales_order, 销售子订单sales_sub_order,关系是一对多。当我们知道销售订单想要获取子订单的数据的获取方式:

 

一、初步设想方法:

批量获取销售子订单数据,往往是循环去调用数据库查询,eg:

 

for (SalesOrder salesOrder : salesOrders) {
            List<SalesSubOrder> salesSubOrders = SalesSubOrderDao
                    .listSalesSubOrderByOrderNo(salesOrder.getSalesOrderNo());
}

 这个时候,当查询的订单数据很大时,批量去查询子订单,调用查询子订单接口数量非常多,这个时候项目经理或者是业务部门的来找你麻烦了,“哎呀,什么破系统了,查个订单数据半天打不开...”

 

 

二、改进方法

既然批量调用查询数据库接口,那好吧,我不批量查询了,我汇总销售订单号,加入索引,批量去查询总可以了吧。调用一次总比你调用100次花时间少吧,于是乎我这样做了。

 

String[] orderNos = new String[salesOrders.size()];

int index = 0;
for (SalesOrder salesOrder : salesOrders) {
     orderNos[index] = salesOrder.getOrderNo();
     index ++;
}
return salesSubOrderDao.listSalesSubOrdersByOrderNos(orderNos);

 这样是可以避免循环去DB查询数据的问题了,可是问题又来了,项目代码评审的时候,一看,我嚓,导出是这种组合某一个属性为数组的操作,都是差不多一个模样,能不能提炼出来,一句代码搞定?

 

 

三、再次改进

当你觉得不合理或者不爽的时候,我就想着去改进一下,一句代码搞定,答案是可以的。

 

salesSubOrderDao.listSalesSubOrdersByOrderNos(
                new ListConvertAdapter<String, SalesChangeOrder>(
                        salesOrders, ListConvertAdapter.CommonPropertyAware.order_no)
                                  .getElements());

 初步设想是这样的,比老是循环去组装数组看得爽点。。。

优化待续,下面是获取类某一属性集合的实现,代码如下:

package com.hqb360.common.lang;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 功能描述:List转换获取参数值适配器
 *
 * @author: Zhenbin.Li
 * Date: 13-11-3 Time:下午12:29
 */
public class ListConvertAdapter<T, V> {

    /** 生成类属性对象List集合 */
    private List<V> objects;

    /** 需要生成List的类属性名称 */
    private String propertyName;

    /**
     * 构造方法: 适配器在创建时,必须传List参数和生成属性名称
     *
     * @param objects   List集合
     * @param propertyName  需要生成List的类属性名称
     */
    public ListConvertAdapter(List<V> objects, String propertyName) {

        this.objects = objects;
        this.propertyName = propertyName;

        if (!validConvertParams()) {
            throw new RuntimeException("传入参数为空,objects=" + objects + ", propertyName=" + propertyName);
        }
    }

    /**
     * List集合对象的某一个属性转换为Object[]集合
     *
     * <p>获取属性list去重复,返回数组</p>
     * @return
     */
    public Object[] getUnRepeatElementsArray() {

        Set<T> objectPropertyElements = getUnRepeatElements();
        if (CollectionUtil.isEmpty(objectPropertyElements)) {
            return null;
        }

        return objectPropertyElements.toArray();
    }

    /**
     * List集合对象的某一个属性转换为Set集合
     *
     * <p>获取属性list去重复,返回HashSet</p>
     * @return
     */
    public Set<T> getUnRepeatElements() {

        List<T> objectPropertyElements = getElements();
        if (CollectionUtil.isEmpty(objectPropertyElements)) {
            return new HashSet<T>(0);
        }

        Set<T> objectPropertyElementSet = Sets.newHashSet();
        for (T objectPropertyElement : objectPropertyElements) {
            objectPropertyElementSet.add(objectPropertyElement);
        }

        return objectPropertyElementSet;
    }

    /**
     * List集合对象的某一个属性转换为Object[]集合
     *
     * @return
     */
    public Object[] getElementsArray() {

        List<T> objectPropertyElements = getElements();
        if (CollectionUtil.isEmpty(objectPropertyElements)) {
            return null;
        }

        return objectPropertyElements.toArray();
    }

    /**
     * List集合对象的某一个属性转换为List集合
     *
     * <p>获取属性list不去重复,返回ArrayList</p>
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<T> getElements() {

        List<T> objectPropertyElements = Lists.newArrayList();
        for (V v : objects) {
            Class<?> clazz = v.getClass();
            // 查询属性在类中存不存在
            // private方法查询
            Field field = null;
            try {
                field = clazz.getDeclaredField(propertyName);
            }
            catch (NoSuchFieldException e) {
            }
            // 查询不到找public方法
            if (field == null) {
                try {
                    field = clazz.getField(propertyName);
                }
                catch (NoSuchFieldException e) {
                }
            }
            // 还是为空直接返回
            if (field == null) {
                return getEmptyValues();
            }

            // 获取方法名称
            StringBuffer nameBuffer = new StringBuffer();
            nameBuffer.append(ElementsMethod.GET.getMethodHeadCode()).append(propertyName);

            // 找出对应方法
            Method getPropertyNameMethod = null;
            Method[] methods = clazz.getMethods();
            if (ArrayUtil.isEmpty(methods)) {
                return getEmptyValues();
            }
            for (Method method : methods) {
                if (method.getName().toUpperCase().equals(nameBuffer.toString().toUpperCase())) {
                    getPropertyNameMethod = method;
                    break;
                }
            }

            // 找不到对应属性的GET方法
            if (getPropertyNameMethod == null) {
                return getEmptyValues();
            }

            try {
                objectPropertyElements.add((T)getPropertyNameMethod.invoke(v));
            }
            catch (IllegalAccessException ex) {
                return getEmptyValues();
            }
            catch (InvocationTargetException ex) {
                return getEmptyValues();
            }
        }

        return objectPropertyElements;
    }

    /**
     * 验证需要转换参数是否符合转换逻辑
     *
     * @return
     */
    protected boolean validConvertParams() {

        // 属性名称为空
        if (StringUtil.isBlank(propertyName)) {
            return false;
        }

        // 传入参数集合为空直接返回空list
        if (CollectionUtil.isEmpty(objects)) {
            return false;
        }

        for (V object : objects) {
            if (object == null) {
                return false;
            }
        }

        return true;
    }

    /**
     * 验证不符合逻辑时,返回空List
     *
     * @return
     */
    private List<T> getEmptyValues() {
        return new ArrayList<T>(0);
    }

    /**
     * 常用获取数组常量,参数取值可以扩展
     */
    protected interface CommonPropertyAware {

        public static final String id = "id";
        public static final String cid = "cid";
        public static final String SPU_ID = "spuId";
        public static final String SKU_ID = "skuId";
        public static final String sku_name = "skuName";
        public static final String order_no = "orderNo";
    }

    /**
     * 类属性方法Head枚举
     */
    protected enum ElementsMethod {

        /** get方法 */
        GET("get"),

        /** boolean方法 */
        IS("is"),

        /** set方法 */
        SET("set");

        /** 方法头参数 */
        private String methodHeadCode;

        /**
         * 构造方法
         *
         * @param methodHeadCode
         */
        private ElementsMethod(String methodHeadCode) {
            this.methodHeadCode = methodHeadCode;
        }

        /**
         * 获取方法Head枚举
         *
         * @return
         */
        private String getMethodHeadCode() {
            return methodHeadCode;
        }
    }
}

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
<p style="margin: 0cm; background: white;"><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">本课程使用<span lang="EN-US">YOLOv5</span>和<span lang="EN-US">DeepSORT</span>对视频的行人、车辆做多目标跟踪和计数,开展<span lang="EN-US">YOLOv5</span>目标检测和<span lang="EN-US">DeepSORT</span>多目标跟踪强强联手的应用。</span></p> <p style="margin: 0cm; background: white;"><span lang="EN-US" style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;"> </span><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">课程分别在</span><span lang="EN-US"><span style="box-sizing: border-box;">Windows</span>和</span><span lang="EN-US" style="font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-color-alt: windowtext;">Ubuntu</span><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">系统上做项目演示,并对<span lang="EN-US">DeepSORT</span>原理和代码做详细解读(使用<span lang="EN-US">PyCharm</span>单步调试讲解)。</span></p> <p style="margin: 0cm; background: white;"><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Arial',sans-serif; color: black; mso-themecolor: text1;"> </span></p> <p style="margin: 0cm; background: white; box-sizing: border-box; font-variant-ligatures: normal; font-variant-caps: normal; orphans: 2; widows: 2; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; word-spacing: 0px;"><span style="box-sizing: border-box;"><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">课程包括:<span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">基础篇、实践篇、原理篇和代码解析篇。</span></span></span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;"><span style="mso-list: Ignore;">Ÿ<span style="font: 7.0pt 'Times New Roman';">  </span></span></span><!--[endif]--><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">基础篇包括多目标跟踪任务介绍、数据集和评估指标;</span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;"><span style="mso-list: Ignore;">Ÿ<span style="font: 7.0pt 'Times New Roman';">  </span></span></span><!--[endif]--><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">实践篇包括</span><span lang="EN-US" style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">Win10</span><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">和<span lang="EN-US">Ubuntu</span>系统上的<span lang="EN-US">YOLOv5+DeepSORT</span>的多目标跟踪和计数具体的实践操作步骤演示,特别是对行人、车辆的<span lang="EN-US">ReID</span>数据集讲解了训练方法;</span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;"><span style="mso-list: Ignore;">Ÿ<span style="font: 7.0pt 'Times New Roman';">  </span></span></span><!--[endif]--><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">原理篇讲解了马氏距离、匈牙利算法、卡尔曼滤波器的原理,并解读了<span lang="EN-US">SORT</span>和<span lang="EN-US">DeepSORT</span>论文;</span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-size: 14.0pt; mso-bidi-font-size: 12.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;"><span style="mso-list: Ignore;">Ÿ<span style="font: 7.0pt 'Times New Roman';">  </span></span></span><!--[endif]--><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">代码解析篇使用<span lang="EN-US">PyCharm</span>单步调试对<span lang="EN-US">DeepSORT</span>的代码逐个文件进行讲解。课程提供注释后的代码。</span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;"><img src="https://img-bss.csdnimg.cn/202105101512471836.jpg" alt="课程内容" /></span></p> <p><img src="https://img-bss.csdnimg.cn/202105101513384587.jpg" alt="行人多目标跟踪" /></p> <p><img src="https://img-bss.csdnimg.cn/202105101514053124.jpg" alt="车辆计数" /></p>
密码:看注释 解压密码146359085 《excel服务器2017程序v3.9》使用说明: 1、本程序支持《excel服务器2017、excel服务器2016、excel服务器2015、excel服务器2013、excel服务器2010》等最新版本版本,不支持excel服务器2019。 2、MSSQL请不要使用空密码,否则注册程序可能失效。 2、本程序没有注册的话,为试用版,用户数最大为10用户,注册后没有限制。 3、安装和装卸本程序时请先停止excel服务器2017的服务。 4、使用本程序时请先删除本软件以前的旧版本补丁。 5、如果下载完整版的升级程序升级,前请先装卸本软件,更新升级后再使用用本软件安装解密。 6、本程序正式版分为标准版及加强版两个版本,标准版只能在你注册的电脑上生效,加强版可以通过下面的操作为其他的excel服务器授权。 7、本程序及其相关内容信息只作为学习、测试使用,严禁用于其它用途!!!、 由于使用本程序而产生的任何后果,请您自已负责!  当您使用了本程序及其相关内容信息后,都将视为接受本警告并自愿承担所有责任!!! 3.9更新说明: 1、修改软件的解密方法,避免后期官方对本软件的检测。 2、修复已知BUG。 3、修复硬件码会变动失效的Bug。 4、新增加对聚表2.6.7的支持。 3.8更新说明: 1、支持《excel服务器2017》。 其他说明: 《excel服务器2016注册程序v3.9加强版》可以用下面步骤为其他服务器授权: 1、在其他安装excel服务器的电脑上运行本软件及安装,并记下硬件码; 2、到安装有正式注册版的那台电脑上运行本软件,把步骤1得到的硬件码填入软件界面上的硬件码位置,设置好选项,然后安装; 3、安装后,打开勤哲安装目录,在目录下找到ESWint12.ini这个文件,把他复制出来。 4、回到步骤1的那台电脑上,把ESWint12.ini覆盖到勤哲的安装目录下,停止excel服务器的服务并从新启动,如果以上步骤没有错误,那这时这台电脑上的excel服务器就是正式注册了。 5、注册时两台电脑要安装同版本的excel服务器。 《聚表企业版2.6.7》的使用方法: 1、找作者开通聚表权限。 2、在《nxcells服务器配置》复制出机器码,把机器码填入本软件《硬件码》,版本选择《聚表企业版2.6.7》按安装即可生成授权。 3、把server.nks复制到聚表企业版2.6.7的server目录下,从新启动服务即可。
<span> </span> <div> 以通俗简介的方式,从浅入深介绍SVM原理和代码流程 让你从此不再惧怕SVM <br /> </div> <div> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="color:#E53333;">视频部分:</span></strong> </p> </div> 01_SVM之回顾梯度下降原理<br /> 02_SVM之回顾有约束的最优化问题<br /> 03_SVM之回顾有约束的最优化问题-KKT几何解释<br /> 04_SVM之回顾有约束的最优化问题-KKT数学解释<br /> 05_SVM之回顾距离公式和感知器模型<br /> 06_SVM之感知器到SVM的引入<br /> 07_SVM之线性可分时损失函数的表示<br /> 08_SVM之线性可分时损失函数的求解-对w,b变量求偏导<br /> 09_SVM之线性可分时损失函数的求解-对β变量求解.<br /> 10_SVM之线性可分时算法整体流程<br /> 11_SVM之线性可分时案例<br /> 12_SVM之线性不可分时软间隔介绍<br /> 13_SVM之线性不可分时软间隔优化目标<br /> 14_SVM之线性不可分时软间隔算法整体流程<br /> 15_SVM之线性不可分时数据映射高维解决不可分问题<br /> 16_SVM之线性不可分时核函数引入<br /> 17_SVM之线性不可分时核函数讲解<br /> 18_SVM代码之线性可分时和Logistic回归比较<br /> 19_SVM代码之基于鸢尾花数据多分类参数解释<br /> 20_SVM代码之基于鸢尾花数据网格搜索选择参数<br /> 21_SVM代码之不同分类器,核函数,C值的可视化比较<br /> <p> 22_SVM之回归方式SVR </p> <p> 23_SVM代码之SVR解决回归问题 </p> 24_SVM之SMO思想引入<br /> <p> 25_SVM之SMO案列讲解 </p> <p> <br /> </p> <p> <strong><span style="color:#E53333;">代码部分:</span></strong> </p> <p> <img src="https://img-bss.csdn.net/202005090648425294.png" alt="" /> </p> <p> <br /> </p> <p> <strong><span style="color:#E53333;">资料部分:</span></strong> </p> <p> <img src="https://img-bss.csdn.net/202005090649458459.png" alt="" /> </p>
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

lizhenbin2008

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值