AJAXJS-Base 工具函数介绍

主要有集合工具类类,map 的工具方法,还有 map/list 的遍历器。源码在:https://gitee.com/sp42/ajaxjs-base/tree/master/src/main/com/ajaxjs/util


字符串工具函数

是否空字符串

assertTrue(isEmptyString(""));
assertTrue(isEmptyString(" "));
assertTrue(isEmptyString(null));

Java String 有 split 却没有 join,这里实现一个

assertEquals(stringJoin(new String[] { "a", "b", "c" }, ","), "a,b,c");
assertEquals(stringJoin(new ArrayList<String>() {
    private static final long serialVersionUID = 1L;
    {
        add("a");
        add("b");
        add("c");
    }
}, ","), "a,b,c");

重复字符串 repeat 次并以 div 分隔

assertEquals(repeatStr("Hi", ",", 3), "Hi,Hi,Hi");

输入 a,看 a 里面是否包含另一个字符串 b,忽略大小写

assertTrue(containsIgnoreCase("abc", "A"));

使用正则的快捷方式

assertEquals(regMatch("^a", "abc"), "a");// 匹配结果,只有匹配第一个
assertEquals(regMatch("^a", "abc", 0), "a");// 可指定分组
assertEquals(regMatch("^a(b)", "abc", 1), "b");

URL 编码/解码,默认 UTF-8 编码

String str = "中国";
assertEquals(urlDecode(urlEncode(str)), str);

Base64 编码/解码

String str = "中国";
assertEquals(base64Decode(base64Encode(str)), str);

使用了 JDK 自带的 sun.misc.BASE64Decoder 实现。

MD5

String str = "中国";
assertEquals(md5("123123"), "4297F44B13955235245B2497399D7A93");

使用了 JDK 自带的 MessageDigest + javax.xml.bind.DatatypeConverter 实现。

字节转为 UTF-8 字符串

public static String byte2String(byte[] bytes);
public static String byte2String(String str);
public static String urlChinese(String str); // url 网址中文乱码处理 

日期工具函数

import static org.junit.Assert.*;

import java.util.Date;
import static com.ajaxjs.util.DateTools.*;
import org.junit.Test;
import com.ajaxjs.util.DateTools;

public class TestDateTools {
    @Test
    public void testNow() {
        assertNotNull(now()); // 返回当前时间的 YYYY-MM-dd HH:MM:ss 字符串类型
        assertNotNull(now(DateTools.commonDateFormat)); // 返回当前时间,并对当前时间进行格式化
    }

    @Test
    public void testFormat() {
        Date date = Objet2Date("2009-07-25 11:16:09");

        assertEquals(formatDate(date), formatDate(date, DateTools.commonDateFormat)); // 对输入的时间进行格式化,采用格式 yyyy-MM-dd HH:mm:ss
        assertEquals(date.toString(), "Tue Jul 25 11:16:09 CST 2009");

        assertEquals(Objet2Date(date).getTime(), date.getTime());
        assertEquals(Objet2Date(date.getTime()).getTime(), date.getTime());
        assertEquals(Objet2Date("2009-07-25 11:16:09").getTime(), date.getTime()); // 转换字符串类型的日期到 Date 类型
    }
}

集合工具函数

集合是否为空

import static com.ajaxjs.util.collection.CollectionUtil.*;
// Array
assertTrue(!isNull(new Object[] { 1, 2 }));
assertTrue(!isNull(new String[] { "1" }));
assertTrue(isNull(new Object[] {}));

Object[] arr = null;
String[] strs = null;
assertTrue(isNull(arr));
assertTrue(isNull(strs));

// List
assertTrue(!isNull(new ArrayList<Object>() {
    private static final long serialVersionUID = 1L;
    {
        add(1);
    }
}));

assertTrue(isNull(new ArrayList<String>()));

assertTrue(!isNull(new ArrayList<Object>() {
    private static final long serialVersionUID = 1L;
    {
        add(null);
    }
}));

// Map
assertTrue(!isNull(new HashMap<String, Object>() {
    private static final long serialVersionUID = 1L;
    {
        put("foo", null);
    }
}));

assertTrue(isNull(new HashMap<String, Object>()));

数组互换

import static com.ajaxjs.util.collection.CollectionUtil.*;

String str = "1,2,3";
int[] arr = new int[] { 1, 2, 3 };

// 当它们每一个都是数字的字符串形式,转换为整形的数组 "1,2,3, ..." --> [1, 2, ...]
assertEquals(Arrays.toString(strArr2intArr(str, ",")), Arrays.toString(arr));
// 整形数组转换为字符数组 [1, 2, ...] --> "1,2,3, ..."
assertEquals(Arrays.toString(int_arr2string_arr(arr)), Arrays.toString(new String[] { "1", "2", "3" }));
// List<String> 转换为字符串数组/数组效的话率更高一些
assertEquals(Arrays.toString(stringList2arr(new ArrayList<String>() {
    private static final long serialVersionUID = 1L;
    {
        add("1");
        add("2");
        add("3");
    }
})), Arrays.toString(new String[] { "1", "2", "3" }));

Map 数据处理

Map 转换为字符串,默认 & 作为分隔符

Map<String, Object> map = new HashMap<String, Object>() {
    private static final long serialVersionUID = 1L;
    {
        put("foo", null);
        put("bar", 500);
        put("zx", "hi");
    }
};

@Test
public void testJoin() {
    assertEquals("zx=hi&foo=null&bar=500", join(asString(map)));
}

Tips:怎么删掉最后一个分号?方法有很多,收集如下:

// 另外一种算法 
for (String key : pair.keySet()) {
    cookieStr += key + "=" + pair.get(key) + ";"; 
    cookieStr = cookieStr.substring(0, cookieStr.length() - 1); 
}
// 另外一种算法 
int i = 0; 
for(String key : hash.keySet()) { 
    ... 
    if(++i != size)
        buff.append(","); 
} 

// 另外一种算法,删除最后一个 , 
if (buff.length() > 1)
    buff = buff.deleteCharAt(buff.length() - 1); 

// 另外一种算法,删除最后一个 , ... 
if(i != arr.length - 1)
    str += ",";

Map 的泛型类型转换,从 Map<String, ?> 转换为 Map<String, String>

@Test
public void testAsString() {
    assertEquals(asString(map).get("bar"), "500");
}

Map 的泛型类型转换,转换为 Map<String, Object>。 可选择类型转换真实值,如 "2"-->2,"true",-->true,"null"-->null。要求 String 类型才可以 CastRealValue TODO 这个是否需要要求这样?

@Test
public void testAsObject() {
    assertEquals(asObject(new HashMap<String, Object>() {
        private static final long serialVersionUID = 1L;
        {
            put("foo", "null");
            put("bar", "500");
            put("zx", "hi");
        }
    }).get("bar"), "500");

    assertEquals(asObject(new HashMap<String, Object>() {
        private static final long serialVersionUID = 1L;
        {
            put("foo", "null");
            put("bar", "500");
            put("zx", "hi");
        }
    }, true).get("bar"), 500);
}

Map<String, String[]> 转换为 Map<String, String>,其中 value[] 变成 , 分割的单个字符串。

assertEquals(toMap(new HashMap<String, String[]>() {
    private static final long serialVersionUID = 1L;
    {
        put("foo", new String[] { "a", "b" });
        put("bar", new String[] { "1", "c", "2" });
    }
}).get("bar"), "1,c,2");

数据结构的简单转换 String[]-->Map

assertEquals(
    toMap(new String[] { "a", "b", "d" }, new String[] { "1", "c", "2" }).get("a"),
    1
);

assertEquals(
    toMap(new String[] { "a=1", "b=2", "d=c" }).get("a"),
    1
);

assertEquals(
    toMap(new String[] { "a=%e4%bd%a0%e5%a5%bd", "b=2", "d=c" }, true).get("a"),
    "你好"
); 

文件增删改

采用链式风格调用;采用 Java 7 autoclose 自动关闭流。

    import com.ajaxjs.util.io.FileUtil;  
      
    public class TestFileUtil {  
        String dir = TestFileUtil.class.getResource("/").getPath();  
        String fullpath = dir + File.separator + "bar.txt";  
      
        @Test  
        public void testCreateRead() {  
            // create and update  
            new FileUtil().setFilePath(fullpath).setOverwrite(true).setContent("hihi").save().close();  
            // read  
            String result = new FileUtil().setFilePath(fullpath).read().byteStream2stringStream().close().getContent();  
              
            System.out.println(result);  
            assertTrue(result.startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"));  
              
            // delete  
            new FileUtil().setFilePath(fullpath).delete();  
        }  
    }  

图片处理工具

import java.io.File;  
import org.junit.Test;  
import com.ajaxjs.util.io.ImageUtil;  
  
public class TestImageUtil {  
    @Test  
    public void 修改图片大小() {  
        new ImageUtil().setFilePath("c://temp//XMM.jpg").setHeight(200).setWidth(150).resize().save();  
    }  
  
    @Test  
    public void 图片裁切() {  
        new ImageUtil().setFilePath("c://temp//XMM.jpg").cut(20, 150, 500, 500).save();  
    }  
  
    @Test  
    public void 水印文字() {  
        new ImageUtil().setFilePath("c://temp//XMM.jpg").mark("我们并肩坐在冰凉的台阶上,有风吹过,有爱来过。却最终被我们,一起错过。 原来,时间真的像流水,走得悄无声息。很多时光,很多事情,很多人,永远只能存在记忆里。").save();  
    }  
  
    @Test  
    public void 水印图片() {  
        new ImageUtil().setFilePath("c://temp//XMM.jpg").mark(new File("c://temp//watermark.jpg")).save();  
    }  
  
}

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页