Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

来源:http://www.cnblogs.com/chenpi/archive/2017/05/30/6920896.html
-Advertisement-
Play Games

前言 前面已經學習了Apache Commons Beanutils包里的PropertyUtils和動態bean,接下來將學習剩下的幾個工具類,個人覺得還是非常實用的,特別是CollectionUtils; BeanUtils 簡單介紹下兩個方法的使用,populate和copyPropertie ...


前言

前面已經學習了Apache Commons Beanutils包里的PropertyUtils和動態bean,接下來將學習剩下的幾個工具類,個人覺得還是非常實用的,特別是CollectionUtils;

BeanUtils

簡單介紹下兩個方法的使用,populate和copyProperties,

populate可以幫助我們把Map里的鍵值對值拷貝到bean的屬性值中;

copyProperties,顧名思義,幫我們拷貝一個bean的屬性到另外一個bean中,註意是淺拷貝

如下示例:

/*
 * File Name: BeanUtilsTest.java
 * Description: 
 * Author: http://www.cnblogs.com/chenpi/
 * Create Date: 2017年5月30日
 */
package apache.commons.beanutils.example.utils;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

import apache.commons.beanutils.example.pojo.User;

/**
 * 
 * @author    http://www.cnblogs.com/chenpi/
 * @version   2017年5月30日
 */

public class BeanUtilsTest
{

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException
    {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "001");
        //map.put("address", "hz");
        map.put("id", "100");
        map.put("state", false);
        map.put("others", "others");
        
        
        User u = new User();
        BeanUtils.populate(u, map);
        
        System.out.println(u);
        
        
        User u1 = new User();
        BeanUtils.copyProperties(u1, u);
        System.out.println(u1);
    }
}

ConvertUtils

實際上,BeanUtils是依賴ConvertUtils來完成實際山的類型轉換,但是有時候我們可能需要自定義轉換器來完成特殊需求的類型轉換;

自定義類型轉換器步驟:

1、定義一個實現類實現Converter介面

2、調用ConvertUtils.register方法,註冊該轉換器

如下是一個實例,我們會在字元串轉換的時候,加上一個首碼:

/*
 * File Name: CustomConverters.java
 * Description: 
 * Author: http://www.cnblogs.com/chenpi/
 * Create Date: 2017年5月30日
 */
package apache.commons.beanutils.example.utils;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

import apache.commons.beanutils.example.pojo.User;

/**
 * 
 * @author    http://www.cnblogs.com/chenpi/
 * @version   2017年5月30日
 */

public class CustomConverters
{

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException
    {
        ConvertUtils.register(new StringConverter(), String.class);
        
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "001");
        map.put("address", "hz");
        map.put("id", "100");
        map.put("state", "false");
        
        
        User u = new User();
        BeanUtils.populate(u, map);
        
        System.out.println(u);
    }
}

class StringConverter implements Converter {  
    /**
     * 
     * 
     * @see org.apache.commons.beanutils.Converter#convert(java.lang.Class, java.lang.Object)
     * @param type
     * @param value
     * @return
     */
    @SuppressWarnings("unchecked")
    @Override
    public <T> T convert(Class<T> type, Object value)
    {

        if(String.class.isInstance(value)){
            return (T) ("###" + value);
        }else{
            return (T) value;
        }
        
    }  
}

這裡有一點需要註意,像BeanUtils, ConvertUtils 和 PropertyUtils工具類都是共用同一個轉換器的,這樣子雖然用起來很方便,但有時候顯得不夠靈活,實際上BeanUtilsConvertUtils 和 PropertyUtils都有一個對應的可實例化的類,即BeanUtilsBean、ConvertUtilsBean、PropertyUtilsBean;

它們的功能與BeanUtilsConvertUtils 和 PropertyUtils類似,區別是它們可以實例化,而且每個實例都可以擁有自己的類型轉換器;

CollectionUtils

顧名思義,集合工具類,只不過它操作的都是集合里的bean,

利用這個工具類,我們可以批量修改、查詢、過濾集合中的bean,甚至還可以拷貝集合中所有bean的某個屬性到另外一個集合中,有點Java 8新特性 Streams 的感覺

如下示例:

/*
 * File Name: CollectionUtilsTest.java
 * Description: 
 * Author: http://www.cnblogs.com/chenpi/
 * Create Date: 2017年5月30日
 */
package apache.commons.beanutils.example.utils;

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

import org.apache.commons.beanutils.BeanPropertyValueChangeClosure;
import org.apache.commons.beanutils.BeanPropertyValueEqualsPredicate;
import org.apache.commons.beanutils.BeanToPropertyValueTransformer;
import org.apache.commons.collections.CollectionUtils;

import apache.commons.beanutils.example.pojo.User;

/**
 * 
 * @author http://www.cnblogs.com/chenpi/
 * @version 2017年5月30日
 */

public class CollectionUtilsTest
{

    public static void main(String[] args)
    {
        List<User> userList = new ArrayList<User>();
        User u1 = new User();
        u1.setId(1l);
        u1.setName("chenpi1");
        u1.setState(true);
        User u2 = new User();
        u2.setId(2l);
        u2.setName("chenpi2");
        User u3 = new User();
        u2.setId(3l);
        u2.setName("chenpi3");
        u2.setState(true);
        userList.add(u1);
        userList.add(u2);
        userList.add(u3);

        //批量修改集合
        BeanPropertyValueChangeClosure closure = new BeanPropertyValueChangeClosure("name",
            "updateName");

        CollectionUtils.forAllDo(userList, closure);

        for (User tmp : userList)
        {
            System.out.println(tmp.getName());
        }
        
        BeanPropertyValueEqualsPredicate predicate =
            new BeanPropertyValueEqualsPredicate( "state", Boolean.TRUE );

        //過濾集合
        CollectionUtils.filter( userList, predicate );
        for (User tmp : userList)
        {
            System.out.println(tmp);
        }
        
        //創建transformer
        BeanToPropertyValueTransformer transformer = new BeanToPropertyValueTransformer( "id" );

        //將集合中所有你user的id傳輸到另外一個集合上
        Collection<?> idList = CollectionUtils.collect( userList, transformer );
        for (Object id : idList)
        {
            System.out.println(id);
        }
    }
}

參考資料

http://commons.apache.org/proper/commons-beanutils/javadocs/v1.9.3/apidocs/org/apache/commons/beanutils/package-summary.html

源碼

https://github.com/peterchenhdu/apache-commons-beanutils-example

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CASE WHEN 條件 THEN 改變的值 END 1.簡單case函數,使用表達式確定返回值: 語法: CASE title WHEN expression1 THEN result1 WHEN expression2 THEN result2 ... WHEN expressionN THEN ...
  • AlexNet(Alex Krizhevsky,ILSVRC2012冠軍)適合做圖像分類。層自左向右、自上向下讀取,關聯層分為一組,高度、寬度減小,深度增加。深度增加減少網路計算量。 訓練模型數據集 Stanford電腦視覺站點Stanford Dogs http://vision.stanfor ...
  • 7.1 raw_input(): raw_input()是python 的內建函數,通過讀取控制台的輸入與用戶實現交互。 raw_input()可以讓用戶輸入字元串(即等待用戶輸入內容),並存放到一個變數里。 運行結果: 7.2 getpass模塊: 輸入密碼時,如果想要不可見,需要利用 getpa ...
  • 對坦克大戰情有獨鍾是因為大學時候第一次參加程式設計比賽就做的這個游戲。當時用的語言是Java,那個比賽讓我悟出了面向對象的強大之處,我也是從那時開始接觸設計模式的。對我而言,坦克大戰有著非同尋常的意義,所以一定要帶大家用C++實現一下。 坦克大戰 我們依然使用EasyX在控制台程式中製作這個游戲程式 ...
  • 本篇文章整理了幾道Linux下C語言的經典面試題,相信對大家更好的理解Linux下的C語言會有很大的幫助,歡迎大家探討指正。 1、如果在Linux下使用GCC編譯器執行下列程式,輸出結果是什麼? 答案如下: 2、C語言程式不使用任何條件運算符,列印出十次"Hello"? 答案如下: 或是: 3、如果 ...
  • 一、實驗原理 二、實驗步驟 三、實驗過程 1.(程式) (1)二分法:求 在區間(1,2)之間的根,取 (a)bipart.m: (b)fun1.m: (2)不動點迭代法:求方程在附近的根,取 (a)budong.m: (b)fun.m (3)牛頓迭代法:求方程在附近的根,取 newton.m: 2 ...
  • CloseHandle函數 來源:https://msdn.microsoft.com/en us/library/windows/desktop/ms724211(v=vs.85).aspx 作用 關閉一個打開的對象句柄。 語法 參數 hObject 已經打開的有效對象句柄。 返回值 如果函數操作 ...
  • 數據類型之集合 set set集合,是一個無序且不重覆的元素集合 A = set([1, 2, 3, 4, 5, 6,]) B = set([2, 3, 4, 5, 6, 7, 8]) type(A) type(B) class set(object): """ set() new empty se ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...