欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java编程Commons lang组件简介

程序员文章站 2024-02-28 12:54:46
        跟java.lang这个包的作用类似,commons lang这一组api也是提供一些...

        跟java.lang这个包的作用类似,commons lang这一组api也是提供一些基础的、通用的操作和处理,如自动生成tostring()的结果、自动实现hashcode()和equals()方法、数组操作、枚举、日期和时间的处理等等。

这一组api的所有包名都以org.apache.commons.lang开头,共有如下8个包:

org.apache.commons.lang

org.apache.commons.lang.builder

org.apache.commons.lang.enum

org.apache.commons.lang.enums

org.apache.commons.lang.exception

org.apache.commons.lang.math

org.apache.commons.lang.mutable

org.apache.commons.lang.time

        其中的lang.enum已不建议使用,替代它的是紧随其后的lang.enums包。 lang包主要是一些可以高度重用的util类;lang.builder包包含了一组用于产生每个java类中都常使用到的tostring()、 hashcode()、equals()、compareto()等等方法的构造器;lang.enums包顾名思义用于处理枚 举;lang.exception包用于处理java标准api中的exception,为1.4之前版本提供nested exception功能;lang.math包用于处理数字;lang.mutable用于包装值型变量;lang.time包提供处理日期和时间的功 能。

        由于commons的包和类实在很多,不可能一个一个讲了,在接下来的专题文章中我就只分别过一下lang、lang.builder、lang.math和lang.time这几个包和常见的用法,其他的我们可以在用到时临时参考一下javadoc。位置就在安装路径的

…\commons-lang-2.1\docs\api\index.html

        我们首先来看org.apache.commons.lang包,这个包提供了一些有用的包含static方法的util类。除了6个exception类和2个已经deprecated的数字类之外,commons.lang包共包含了17个实用的类:

arrayutils – 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等;

bitfield – 用于操作位元,提供了一些方便而安全的方法;

booleanutils – 用于操作和转换boolean或者boolean及相应的数组;

charencoding – 包含了java环境支持的字符编码,提供是否支持某种编码的判断;

charrange – 用于设定字符范围并做相应检查;

charset – 用于设定一组字符作为范围并做相应检查;

charsetutils – 用于操作charset;

charutils – 用于操作char值和character对象;

classutils – 用于对java类的操作,不使用反射;

objectutils – 用于操作java对象,提供null安全的访问和其他一些功能;

randomstringutils – 用于生成随机的字符串;

serializationutils – 用于处理对象序列化,提供比一般java序列化更高级的处理能力;

stringescapeutils – 用于正确处理转义字符,产生正确的java、javascript、html、xml和sql代码;

stringutils – 处理string的核心类,提供了相当多的功能;

systemutils – 在java.lang.system基础上提供更方便的访问,如用户路径、java版本、时区、操作系统等判断;

validate – 提供验证的操作,有点类似assert断言;

wordutils – 用于处理单词大小写、换行等。

下面讲下最常用的两个类

arrayutils

        数组是我们经常需要使用到的一种数据结构,但是由于java本身并没有提供很好的api支持,使得很多操作实际上做起来相当繁琐,以至于我们实际编 码中甚至会不惜牺牲性能去使用collections api,用collection当然能够很方便的解决我们的问题,但是我们一定要以性能为代价吗?arrayutils帮我们解决了处理类似情况的大部分 问题。来看一个例子:

view plaincopy to clipboardprint?
package sean.study.jakarta.commons.lang; 
 
 
 
import java.util.map; 
 
import org.apache.commons.lang.arrayutils; 
 
 
 
public class arrayutilsusage { 
 
 
 
 public static void main(string[] args) { 
 
 
 
  // data setup 
 
  int[] intarray1 = { 2, 4, 8, 16 }; 
 
  int[][] intarray2 = { { 1, 2 }, { 2, 4 }, { 3, 8 }, { 4, 16 } }; 
 
  object[][] notamap = { 
 
    { "a", new double(100) }, 
 
    { "b", new double(80) }, 
 
    { "c", new double(60) }, 
 
    { "d", new double(40) }, 
 
    { "e", new double(20) } 
 
  }; 
 
 
 
  // printing arrays 
 
  system.out.println("intarray1: " + arrayutils.tostring(intarray1)); 
 
  system.out.println("intarray2: " + arrayutils.tostring(intarray2)); 
 
  system.out.println("notamap: " + arrayutils.tostring(notamap)); 
 
 
 
  // finding items 
 
  system.out.println("intarray1 contains '8'? " 
 
    + arrayutils.contains(intarray1, 8)); 
 
  system.out.println("intarray1 index of '8'? " 
 
    + arrayutils.indexof(intarray1, 8)); 
 
  system.out.println("intarray1 last index of '8'? " 
 
    + arrayutils.lastindexof(intarray1, 8)); 
 
 
 
  // cloning and resversing 
 
  int[] intarray3 = arrayutils.clone(intarray1); 
 
  system.out.println("intarray3: " + arrayutils.tostring(intarray3)); 
 
  arrayutils.reverse(intarray3); 
 
  system.out.println("intarray3 reversed: " 
 
    + arrayutils.tostring(intarray3)); 
 
 
 
  // primitive to object array 
 
  integer[] integerarray1 = arrayutils.toobject(intarray1); 
 
  system.out.println("integerarray1: " 
 
    + arrayutils.tostring(integerarray1)); 
 
 
 
  // build map from two dimensional array 
 
  map map = arrayutils.tomap(notamap); 
 
  double res = (double) map.get("c"); 
 
  system.out.println("get 'c' from map: " + res); 
 
 
 
 } 
 
 
 
} 

  
以下是运行结果:   
intarray1: {2,4,8,16}   
intarray2: {{1,2},{2,4},{3,8},{4,16}}   
notamap: {{a,100.0},{b,80.0},{c,60.0},{d,40.0},{e,20.0}}   
intarray1 contains '8'? true  
intarray1 index of '8'? 2  
intarray1 last index of '8'? 2  
intarray3: {2,4,8,16}   
intarray3 reversed: {16,8,4,2}   
integerarray1: {2,4,8,16}   
get 'c' from map: 60.0  

package sean.study.jakarta.commons.lang;

import java.util.map;

import org.apache.commons.lang.arrayutils;

public class arrayutilsusage {

 public static void main(string[] args) {

  // data setup

  int[] intarray1 = { 2, 4, 8, 16 };

  int[][] intarray2 = { { 1, 2 }, { 2, 4 }, { 3, 8 }, { 4, 16 } };

  object[][] notamap = {

    { "a", new double(100) },

    { "b", new double(80) },

    { "c", new double(60) },

    { "d", new double(40) },

    { "e", new double(20) }

  };

  // printing arrays

  system.out.println("intarray1: " + arrayutils.tostring(intarray1));

  system.out.println("intarray2: " + arrayutils.tostring(intarray2));

  system.out.println("notamap: " + arrayutils.tostring(notamap));

  // finding items

  system.out.println("intarray1 contains '8'? "

    + arrayutils.contains(intarray1, 8));

  system.out.println("intarray1 index of '8'? "

    + arrayutils.indexof(intarray1, 8));

  system.out.println("intarray1 last index of '8'? "

    + arrayutils.lastindexof(intarray1, 8));

  // cloning and resversing

  int[] intarray3 = arrayutils.clone(intarray1);

  system.out.println("intarray3: " + arrayutils.tostring(intarray3));

  arrayutils.reverse(intarray3);

  system.out.println("intarray3 reversed: "

    + arrayutils.tostring(intarray3));

  // primitive to object array

  integer[] integerarray1 = arrayutils.toobject(intarray1);

  system.out.println("integerarray1: "

    + arrayutils.tostring(integerarray1));

  // build map from two dimensional array

  map map = arrayutils.tomap(notamap);

  double res = (double) map.get("c");

  system.out.println("get 'c' from map: " + res);

 }

}

以下是运行结果:

intarray1: {2,4,8,16}

intarray2: {{1,2},{2,4},{3,8},{4,16}}

notamap: {{a,100.0},{b,80.0},{c,60.0},{d,40.0},{e,20.0}}

intarray1 contains '8'? true

intarray1 index of '8'? 2

intarray1 last index of '8'? 2

intarray3: {2,4,8,16}

intarray3 reversed: {16,8,4,2}

integerarray1: {2,4,8,16}

get 'c' from map: 60.0

        这段代码说明了我们可以如何方便的利用arrayutils类帮我们完成数组的打印、查找、克隆、倒序、以及值型/对象数组之间的转换等操作。

stringutils

        处理文本对java应用来说应该算是家常便饭了,在1.4出现之前,java自身提供的api非常有限,如string、 stringtokenizer、stringbuffer,操作也比较单一。无非就是查找substring、分解、合并等等。到1.4的出现可以说 java的文字处理上了一个台阶,因为它支持regular expression了。这可是个重量级而方便的东东啊,缺点是太复杂,学习起来有一定难度。相较而言,jakarta commons提供的stringutils和wordutils至今还维持着那种简洁而强大的美,使用起来也很顺手。来看一个例子:

view plaincopy to clipboardprint?
package sean.study.jakarta.commons.lang; 
 
 
 
import org.apache.commons.lang.stringutils; 
 
 
 
public class stringutilsandwordutilsusage { 
 
 
 
 public static void main(string[] args) { 
 
   
 
  // data setup 
 
  string str1 = ""; 
 
  string str2 = " "; 
 
  string str3 = "\t"; 
 
  string str4 = null; 
 
  string str5 = "123"; 
 
  string str6 = "abcdefg"; 
 
  string str7 = "it feels good to use jakarta commons.\r\n"; 
 
   
 
  // check for empty strings 
 
  system.out.println("=============================="); 
 
  system.out.println("is str1 blank? " + stringutils.isblank(str1)); 
 
  system.out.println("is str2 blank? " + stringutils.isblank(str2)); 
 
  system.out.println("is str3 blank? " + stringutils.isblank(str3)); 
 
  system.out.println("is str4 blank? " + stringutils.isblank(str4)); 
 
   
 
  // check for numerics 
 
  system.out.println("=============================="); 
 
  system.out.println("is str5 numeric? " + stringutils.isnumeric(str5)); 
 
  system.out.println("is str6 numeric? " + stringutils.isnumeric(str6)); 
 
   
 
  // reverse strings / whole words 
 
  system.out.println("=============================="); 
 
  system.out.println("str6: " + str6); 
 
  system.out.println("str6 reversed: " + stringutils.reverse(str6)); 
 
  system.out.println("str7: " + str7); 
 
  string str8 = stringutils.chomp(str7); 
 
  str8 = stringutils.reversedelimited(str8, ' '); 
 
  system.out.println("str7 reversed whole words : \r\n" + str8); 
 
   
 
  // build header (useful to print log messages that are easy to locate) 
 
  system.out.println("=============================="); 
 
  system.out.println("print header:"); 
 
  string padding = stringutils.repeat("=", 50); 
 
  string msg = stringutils.center(" customised header ", 50, "%"); 
 
  object[] raw = new object[]{padding, msg, padding}; 
 
  string header = stringutils.join(raw, "\r\n"); 
 
  system.out.println(header); 
 
 
 
 } 
 
} 

  
    
  
输出的结果如下:   
==============================   
  
is str1 blank? true  
  
is str2 blank? true  
  
is str3 blank? true  
  
is str4 blank? true  
  
==============================   
  
is str5 numeric? true  
  
is str6 numeric? false  
  
==============================   
  
str6: abcdefg   
  
str6 reversed: gfedcba   
  
str7: it feels good to use jakarta commons.   
  
    
  
str7 reversed whole words :    
  
commons. jakarta use to good feels it   
  
==============================   
  
print header:   
  
==================================================   
  
%%%%%%%%%%%%%%% customised header %%%%%%%%%%%%%%%%   
  
==================================================  

package sean.study.jakarta.commons.lang;

import org.apache.commons.lang.stringutils;

public class stringutilsandwordutilsusage {

 public static void main(string[] args) {

  

  // data setup

  string str1 = "";

  string str2 = " ";

  string str3 = "\t";

  string str4 = null;

  string str5 = "123";

  string str6 = "abcdefg";

  string str7 = "it feels good to use jakarta commons.\r\n";

  

  // check for empty strings

  system.out.println("==============================");

  system.out.println("is str1 blank? " + stringutils.isblank(str1));

  system.out.println("is str2 blank? " + stringutils.isblank(str2));

  system.out.println("is str3 blank? " + stringutils.isblank(str3));

  system.out.println("is str4 blank? " + stringutils.isblank(str4));

  

  // check for numerics

  system.out.println("==============================");

  system.out.println("is str5 numeric? " + stringutils.isnumeric(str5));

  system.out.println("is str6 numeric? " + stringutils.isnumeric(str6));

  

  // reverse strings / whole words

  system.out.println("==============================");

  system.out.println("str6: " + str6);

  system.out.println("str6 reversed: " + stringutils.reverse(str6));

  system.out.println("str7: " + str7);

  string str8 = stringutils.chomp(str7);

  str8 = stringutils.reversedelimited(str8, ' ');

  system.out.println("str7 reversed whole words : \r\n" + str8);

  

  // build header (useful to print log messages that are easy to locate)

  system.out.println("==============================");

  system.out.println("print header:");

  string padding = stringutils.repeat("=", 50);

  string msg = stringutils.center(" customised header ", 50, "%");

  object[] raw = new object[]{padding, msg, padding};

  string header = stringutils.join(raw, "\r\n");

  system.out.println(header);

 }

}

输出的结果如下:

==============================

is str1 blank? true

is str2 blank? true

is str3 blank? true

is str4 blank? true

==============================

is str5 numeric? true

is str6 numeric? false

==============================

str6: abcdefg

str6 reversed: gfedcba

str7: it feels good to use jakarta commons.

str7 reversed whole words :

commons. jakarta use to good feels it

==============================

print header:

==================================================

%%%%%%%%%%%%%%% customised header %%%%%%%%%%%%%%%%

==================================================

        从代码中我们可以大致了解到这个stringutils类简单而强大的处理能力,从检查空串(对null的情况处理很得体),到分割子串,到生成格式化的字符串,使用都很简洁,也很直截了当。

总结

        以上就是本文的全部内容,希望对大家有所帮助。