【Java】利用json工具类,传入字段名,获取集合中的对象属性值集合

本文介绍了一个实用的工具类,用于从对象集合中抽取指定属性值,支持不同类型的属性集合输出,如Set<String>、Set<Integer>及List<Map>,并提供了测试代码示例。
摘要由CSDN通过智能技术生成

  经常需要在对象集合中,将某个对象的一个或多个属性值抽出来扔到一个集合中。代码如下:

  一个属性值:

        Set<Integer> set = new HashSet<>();
        for (User user : users) {
            set.add(user.getId());
        }

  多个属性值:

        List<Map<String, Object>> list = new ArrayList<>();
        for (User user : users) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", user.getId());
            map.put("name", user.getName());
            list.add(map);
        }

  

  现在写一个利用json工具类,传入字段名,获取集合中的对象属性值集合的工具类。

  1. 添加json依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>${fastjson.version}</version>
</dependency>

  2.工具类

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.*;

/**
 *@Author: lzf
 *@Date: 2020/4/8 10:58
 *@Description: 通过字段名,将集合中的值抽出。利用阿里巴巴json工具类,未直接使用反射
 */
public class PropertyUtil {

    /**
     * 描述: 通过字段名,将集合中的值抽出,放在Set<String>集合中
     * @param collection 资源集合
     * @param property 目标字段名
     * @return java.util.Set<java.lang.String>
     * @date: 2020/4/8 14:10
     */
    public static Set<String> getStringValueSet(Collection<?> collection, String property) {
        Set<String> paramSet = new HashSet<>();
        if (collection != null && !collection.isEmpty()) {
            JSONArray array = (JSONArray) JSONObject.toJSON(collection);
            for (int i = 0; i < array.size(); i++) {
                JSONObject object = array.getJSONObject(i);
                if (object.getString(property) != null) {
                    paramSet.add(object.getString(property));
                }
            }
        }
        return paramSet;
    }

    /**
     * 描述: 通过字段名,将集合中的值抽出,放在Set<Integer>集合中
     * @param collection 资源集合
     * @param property 目标字段名
     * @return java.util.Set<java.lang.Integer>
     * @date: 2020/4/8 14:09
     */
    public static Set<Integer> getIntegerValueSet(Collection<?> collection, String property) {
        Set<Integer> paramSet = new HashSet<>();
        if (collection != null && !collection.isEmpty()) {
            JSONArray array = (JSONArray) JSONObject.toJSON(collection);
            for (int i = 0; i < array.size(); i++) {
                JSONObject object = array.getJSONObject(i);
                if (object.getInteger(property) != null) {
                    paramSet.add(object.getInteger(property));
                }
            }
        }
        return paramSet;
    }

    /**
     * 描述:将对象的属性值放在map中
     *      return [{"id",123,"name":"张三","status":"1"},{...}]
     * @param collection 资源集合
     * @param properties 目标字段名
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @date: 2020/4/8 14:09
     */
    public static List<Map<String, Object>> getStringPropertyMap(Collection<?> collection, String... properties) {
        List<Map<String, Object>> dataList = new ArrayList<>();
        if (collection != null && !collection.isEmpty()) {
            JSONArray array = (JSONArray) JSONObject.toJSON(collection);
            for (int i = 0; i < array.size(); i++) {
                JSONObject object = array.getJSONObject(i);
                Map<String, Object> map = new HashMap<>();
                for (String property : properties) {
                    map.put(property, object.get(property));
                }
                if (!map.isEmpty()) {
                    dataList.add(map);
                }
            }
        }
        return dataList;
    }
}

  3.新建一个对象User用来测试

/**
 * @Author: lzf
 * @Date: 2020/4/8 11:38
 * @Description: 测试对象
 */
public class User {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  4.生成测试类

import java.util.*;

/**
 * @Author: lzf
 * @Date: 2020/4/8 11:37
 * @Description:
 */
public class PropertyUtilTest {

    public static void main(String[] args) {
        List<User> users = initUserList();

        System.out.println("Integer属性:" + PropertyUtil.getIntegerValueSet(users, "id").toString());
        System.out.println("String属性:" + PropertyUtil.getStringValueSet(users, "name").toString());
        System.out.println("String属性Map:" + PropertyUtil.getStringPropertyMap(users, "id", "name").toString());
    }

    /**
     * 描述:生成 测试数据
     * @param
     * @return java.util.List<User>
     * @date: 2020/4/8 14:36
     */
    private static List<User> initUserList() {
        List<User> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId(i);
            user.setName("User_" + i);
            list.add(user);
        }
        return list;
    }
}

  5.输出

Integer属性:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
String属性:[User_4, User_5, User_6, User_7, User_8, User_9, User_0, User_1, User_2, User_3]
String属性Map:[{name=User_0, id=0}, {name=User_1, id=1}, {name=User_2, id=2}, {name=User_3, id=3}, {name=User_4, id=4}, {name=User_5, id=5}, {name=User_6, id=6}, {name=User_7, id=7}, {name=User_8, id=8}, {name=User_9, id=9}]

 

  简单的写了三个方法,如果有其他需求可以自行完善修改代码。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值