`
lizhenbin2010
  • 浏览: 101273 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 
阅读更多

       工作中,难免在重复的做一些事情,查询数据。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;
        }
    }
}

 

 

分享到:
评论

相关推荐

    C#特性-对象集合初始化器介绍

    C#特性中的对象集合初始化器是一项非常实用的功能,它简化了创建和初始化对象以及集合的过程。在传统的编程中,我们通常需要为实体类编写多个构造函数来处理不同数量和类型的参数,以便在创建对象时进行初始化。然而...

    AutoMapper.zip

    这里的`复杂对象源类`是含有众多属性和可能嵌套对象的类,而`对象列表目标类`可能是一个简单的列表,其中每个元素是源类的一个精简版本。一旦配置完成,我们可以在代码中使用`Mapper.Map`方法来执行实际的转换: ``...

    Java语言面向对象高级程序

    11. 集合框架:Java集合框架包括接口(如List、Set、Map)和实现这些接口的类(如ArrayList、HashSet、HashMap),提供了存储和操作对象的高效工具。 12. 多线程:Java内置了对多线程的支持,可以使用`Thread`类或`...

    C#检查指定对象是否存在于ArrayList集合中的方法

    在C#编程中,处理数据集合时,我们经常需要判断一个特定的对象是否已经存在于集合中。ArrayList是.NET框架早期版本中常用的一种动态数组,它允许存储任意类型的对象。本篇文章将详细讲解如何使用C#的ArrayList类的...

    集合类Array List HashTable实例操作练习

    ArrayList的使用要包含System.Collections命名空间,并提供了Capacity和Count两个属性以及一系列操作元素的方法。 ArrayList添加元素的方法包括Add()、AddRange()。Add()方法用于添加单个元素到ArrayList的末尾,而...

    java对象复制

    因此,函数内部对对象的任何修改会影响到原始对象,就像上面代码示例中`myMethod()`函数改变`Point`对象的`x`属性一样。 为了实现期望的不修改原始对象的效果,我们可以使用对象的克隆(Clone)机制。Java中的克隆...

    Java语言与面向对象程序设计

    例如,集合框架(如List, Set, Map)提供了存储和操作对象的有效方式,而线程机制使得Java能够实现并发执行,提高程序效率。 Java的内存管理和垃圾回收机制也是其独特之处。Java程序员无需手动管理内存,因为JVM会...

    html的DOM中document对象images集合用法实例

    其中一个重要的属性是 `images` 集合,这个集合包含了文档中所有 `&lt;img&gt;` 标签所表示的图像对象。了解并熟练运用 `document.images` 可以帮助开发者在JavaScript中对页面上的图片进行各种操作。 `document.images` ...

    MyBatis一对多的代码

    对于一对多关系,父类通常包含一个集合类型的属性,用于存储子类对象。例如,`Student`类有一个`List&lt;Course&gt;`类型的`courses`属性。 ```java public class Student { private int id; private String name; ...

    值得一看的java面试题

    ### 值得一看的Java面试题解析 #### 一、final、finally、finalize - **final**: 这个关键字在Java中具有多种用途。当应用于变量时,它表示该变量一旦被初始化就不能再被修改;当应用于方法时,表示该方法不能被子...

    commons-beanutils的api文档.rar

    总的来说,Apache Commons BeanUtils是一个强大而实用的工具库,它简化了JavaBean的操作,提高了开发效率,对于处理对象属性的读写、类型转换和对象复制等工作,BeanUtils都是一个值得信赖的选择。这份API文档是...

    java面试题(尚学堂内部培训资源,绝对值得一看)

    - **实例变量**:属于对象,每个对象各自拥有一份,没有`static`修饰。 #### 41. 是否可以从一个static方法内部发出对非static方法的调用? 不可以,因为非静态方法依赖于对象实例的存在,而静态方法是在类加载时...

    Ruby-RedisObjects直接将Redis类型映射成Ruby对象

    - **类型安全**: 每个Redis数据结构都对应Ruby类的一个属性,确保了数据类型的一致性。 - **自动持久化**: Redis-Objects自动将Ruby对象的变化同步到Redis,无需手动保存。 - **缓存**: 通过缓存机制,Redis-Objects...

    把JS中一数组的值得赋给下拉框

    这个过程涉及到DOM(文档对象模型)操作,理解数组和循环的概念,以及HTML元素的属性设置。下面将详细介绍如何实现这一功能。 首先,我们需要创建一个`&lt;select&gt;`元素。HTML中的`&lt;select&gt;`元素用于创建下拉列表,...

    struts2中的OGNL的源码

    3. **集合操作**:支持对集合进行操作,如`list[0]`访问列表的第一个元素,`map["key"]`访问映射中的值。 4. **运算符支持**:包括算术运算、比较运算、逻辑运算等。 5. **上下文变量**:OGNL表达式可以在当前上...

    javaOOP第十一章案例

    然后,我们使用`ResultSet`遍历查询结果,将每一项数据转换为`NewsItem`对象,并添加到集合中: ```java while (resultSet.next()) { NewsItem item = new NewsItem(); item.setTitle(resultSet.getString("title...

    redis基础数据结构讲解

    比如,对于一个用户对象,可以将其每个属性抽象为一个field,而每个属性的值则作为对应的value。hash提供了字段的单独设置和获取操作,如hset和hget,以及获取所有字段和值的hgetall操作。由于hash存储的是键值对...

    vs2008中文教程-C# 语言规范 3.0 版

    匿名类型是C# 3.0中的一大特色,它允许在不创建显式类的情况下,创建具有自动生成的名称和属性的对象。这在处理临时数据时非常有用。例如,`new { Name = "John", Age = 30 }` 就是一个匿名类型的实例。 3. **LINQ...

    Thinking in Java

    4. **集合框架**:Java集合框架是一组接口和类,用于存储和操作对象的集合。主要包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)。这些接口和类提供了丰富的操作方法,...

Global site tag (gtag.js) - Google Analytics