Java的 类型转换器工具类Convert

类型转换


package com.ruoyi.common.core.text;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.util.Set;
import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.lang3.ArrayUtils;

/**
 * 类型转换器
 *
 * @author ruoyi
 */
public class Convert
{
    /**
     * 转换为字符串<br>
     * 如果给定的值为null,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static String toStr(Object value, String defaultValue)
    {
        if (null == value)
        {
            return defaultValue;
        }
        if (value instanceof String)
        {
            return (String) value;
        }
        return value.toString();
    }

    /**
     * 转换为字符串<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static String toStr(Object value)
    {
        return toStr(value, null);
    }

    /**
     * 转换为字符<br>
     * 如果给定的值为null,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Character toChar(Object value, Character defaultValue)
    {
        if (null == value)
        {
            return defaultValue;
        }
        if (value instanceof Character)
        {
            return (Character) value;
        }

        final String valueStr = toStr(value, null);
        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
    }

    /**
     * 转换为字符<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Character toChar(Object value)
    {
        return toChar(value, null);
    }

    /**
     * 转换为byte<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Byte toByte(Object value, Byte defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Byte)
        {
            return (Byte) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).byteValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Byte.parseByte(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为byte<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Byte toByte(Object value)
    {
        return toByte(value, null);
    }

    /**
     * 转换为Short<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Short toShort(Object value, Short defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Short)
        {
            return (Short) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).shortValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Short.parseShort(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为Short<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Short toShort(Object value)
    {
        return toShort(value, null);
    }

    /**
     * 转换为Number<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Number toNumber(Object value, Number defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Number)
        {
            return (Number) value;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return NumberFormat.getInstance().parse(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为Number<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Number toNumber(Object value)
    {
        return toNumber(value, null);
    }

    /**
     * 转换为int<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Integer toInt(Object value, Integer defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Integer)
        {
            return (Integer) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).intValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Integer.parseInt(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为int<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Integer toInt(Object value)
    {
        return toInt(value, null);
    }

    /**
     * 转换为Integer数组<br>
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static Integer[] toIntArray(String str)
    {
        return toIntArray(",", str);
    }

    /**
     * 转换为Long数组<br>
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String str)
    {
        return toLongArray(",", str);
    }

    /**
     * 转换为Integer数组<br>
     *
     * @param split 分隔符
     * @param split 被转换的值
     * @return 结果
     */
    public static Integer[] toIntArray(String split, String str)
    {
        if (StringUtils.isEmpty(str))
        {
            return new Integer[] {};
        }
        String[] arr = str.split(split);
        final Integer[] ints = new Integer[arr.length];
        for (int i = 0; i < arr.length; i++)
        {
            final Integer v = toInt(arr[i], 0);
            ints[i] = v;
        }
        return ints;
    }

    /**
     * 转换为Long数组<br>
     *
     * @param split 分隔符
     * @param str 被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String split, String str)
    {
        if (StringUtils.isEmpty(str))
        {
            return new Long[] {};
        }
        String[] arr = str.split(split);
        final Long[] longs = new Long[arr.length];
        for (int i = 0; i < arr.length; i++)
        {
            final Long v = toLong(arr[i], null);
            longs[i] = v;
        }
        return longs;
    }

    /**
     * 转换为String数组<br>
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static String[] toStrArray(String str)
    {
        return toStrArray(",", str);
    }

    /**
     * 转换为String数组<br>
     *
     * @param split 分隔符
     * @param split 被转换的值
     * @return 结果
     */
    public static String[] toStrArray(String split, String str)
    {
        return str.split(split);
    }

    /**
     * 转换为long<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Long toLong(Object value, Long defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Long)
        {
            return (Long) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).longValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            // 支持科学计数法
            return new BigDecimal(valueStr.trim()).longValue();
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为long<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Long toLong(Object value)
    {
        return toLong(value, null);
    }

    /**
     * 转换为double<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Double toDouble(Object value, Double defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Double)
        {
            return (Double) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).doubleValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            // 支持科学计数法
            return new BigDecimal(valueStr.trim()).doubleValue();
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为double<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Double toDouble(Object value)
    {
        return toDouble(value, null);
    }

    /**
     * 转换为Float<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Float toFloat(Object value, Float defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Float)
        {
            return (Float) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).floatValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Float.parseFloat(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为Float<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Float toFloat(Object value)
    {
        return toFloat(value, null);
    }

    /**
     * 转换为boolean<br>
     * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Boolean toBool(Object value, Boolean defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Boolean)
        {
            return (Boolean) value;
        }
        String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        valueStr = valueStr.trim().toLowerCase();
        switch (valueStr)
        {
            case "true":
                return true;
            case "false":
                return false;
            case "yes":
                return true;
            case "ok":
                return true;
            case "no":
                return false;
            case "1":
                return true;
            case "0":
                return false;
            default:
                return defaultValue;
        }
    }

    /**
     * 转换为boolean<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Boolean toBool(Object value)
    {
        return toBool(value, null);
    }

    /**
     * 转换为Enum对象<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     *
     * @param clazz Enum的Class
     * @param value 值
     * @param defaultValue 默认值
     * @return Enum
     */
    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (clazz.isAssignableFrom(value.getClass()))
        {
            @SuppressWarnings("unchecked")
            E myE = (E) value;
            return myE;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Enum.valueOf(clazz, valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为Enum对象<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     *
     * @param clazz Enum的Class
     * @param value 值
     * @return Enum
     */
    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value)
    {
        return toEnum(clazz, value, null);
    }

    /**
     * 转换为BigInteger<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof BigInteger)
        {
            return (BigInteger) value;
        }
        if (value instanceof Long)
        {
            return BigInteger.valueOf((Long) value);
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return new BigInteger(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为BigInteger<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static BigInteger toBigInteger(Object value)
    {
        return toBigInteger(value, null);
    }

    /**
     * 转换为BigDecimal<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof BigDecimal)
        {
            return (BigDecimal) value;
        }
        if (value instanceof Long)
        {
            return new BigDecimal((Long) value);
        }
        if (value instanceof Double)
        {
            return new BigDecimal((Double) value);
        }
        if (value instanceof Integer)
        {
            return new BigDecimal((Integer) value);
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return new BigDecimal(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /**
     * 转换为BigDecimal<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static BigDecimal toBigDecimal(Object value)
    {
        return toBigDecimal(value, null);
    }

    /**
     * 将对象转为字符串<br>
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
     *
     * @param obj 对象
     * @return 字符串
     */
    public static String utf8Str(Object obj)
    {
        return str(obj, CharsetKit.CHARSET_UTF_8);
    }

    /**
     * 将对象转为字符串<br>
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
     *
     * @param obj 对象
     * @param charsetName 字符集
     * @return 字符串
     */
    public static String str(Object obj, String charsetName)
    {
        return str(obj, Charset.forName(charsetName));
    }

    /**
     * 将对象转为字符串<br>
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
     *
     * @param obj 对象
     * @param charset 字符集
     * @return 字符串
     */
    public static String str(Object obj, Charset charset)
    {
        if (null == obj)
        {
            return null;
        }

        if (obj instanceof String)
        {
            return (String) obj;
        }
        else if (obj instanceof byte[])
        {
            return str((byte[]) obj, charset);
        }
        else if (obj instanceof Byte[])
        {
            byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj);
            return str(bytes, charset);
        }
        else if (obj instanceof ByteBuffer)
        {
            return str((ByteBuffer) obj, charset);
        }
        return obj.toString();
    }

    /**
     * 将byte数组转为字符串
     *
     * @param bytes byte数组
     * @param charset 字符集
     * @return 字符串
     */
    public static String str(byte[] bytes, String charset)
    {
        return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
    }

    /**
     * 解码字节码
     *
     * @param data 字符串
     * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
     * @return 解码后的字符串
     */
    public static String str(byte[] data, Charset charset)
    {
        if (data == null)
        {
            return null;
        }

        if (null == charset)
        {
            return new String(data);
        }
        return new String(data, charset);
    }

    /**
     * 将编码的byteBuffer数据转换为字符串
     *
     * @param data 数据
     * @param charset 字符集,如果为空使用当前系统字符集
     * @return 字符串
     */
    public static String str(ByteBuffer data, String charset)
    {
        if (data == null)
        {
            return null;
        }

        return str(data, Charset.forName(charset));
    }

    /**
     * 将编码的byteBuffer数据转换为字符串
     *
     * @param data 数据
     * @param charset 字符集,如果为空使用当前系统字符集
     * @return 字符串
     */
    public static String str(ByteBuffer data, Charset charset)
    {
        if (null == charset)
        {
            charset = Charset.defaultCharset();
        }
        return charset.decode(data).toString();
    }

    // ----------------------------------------------------------------------- 全角半角转换
    /**
     * 半角转全角
     *
     * @param input String.
     * @return 全角字符串.
     */
    public static String toSBC(String input)
    {
        return toSBC(input, null);
    }

    /**
     * 半角转全角
     *
     * @param input String
     * @param notConvertSet 不替换的字符集合
     * @return 全角字符串.
     */
    public static String toSBC(String input, Set<Character> notConvertSet)
    {
        char c[] = input.toCharArray();
        for (int i = 0; i < c.length; i++)
        {
            if (null != notConvertSet && notConvertSet.contains(c[i]))
            {
                // 跳过不替换的字符
                continue;
            }

            if (c[i] == ' ')
            {
                c[i] = '\u3000';
            }
            else if (c[i] < '\177')
            {
                c[i] = (char) (c[i] + 65248);

            }
        }
        return new String(c);
    }

    /**
     * 全角转半角
     *
     * @param input String.
     * @return 半角字符串
     */
    public static String toDBC(String input)
    {
        return toDBC(input, null);
    }

    /**
     * 替换全角为半角
     *
     * @param text 文本
     * @param notConvertSet 不替换的字符集合
     * @return 替换后的字符
     */
    public static String toDBC(String text, Set<Character> notConvertSet)
    {
        char c[] = text.toCharArray();
        for (int i = 0; i < c.length; i++)
        {
            if (null != notConvertSet && notConvertSet.contains(c[i]))
            {
                // 跳过不替换的字符
                continue;
            }

            if (c[i] == '\u3000')
            {
                c[i] = ' ';
            }
            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
            {
                c[i] = (char) (c[i] - 65248);
            }
        }
        String returnString = new String(c);

        return returnString;
    }

    /**
     * 数字金额大写转换 先写个完整的然后将如零拾替换成零
     *
     * @param n 数字
     * @return 中文大写数字
     */
    public static String digitUppercase(double n)
    {
        String[] fraction = { "角", "分" };
        String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
        String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };

        String head = n < 0 ? "负" : "";
        n = Math.abs(n);

        String s = "";
        for (int i = 0; i < fraction.length; i++)
        {
            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
        }
        if (s.length() < 1)
        {
            s = "整";
        }
        int integerPart = (int) Math.floor(n);

        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
        {
            String p = "";
            for (int j = 0; j < unit[1].length && n > 0; j++)
            {
                p = digit[integerPart % 10] + unit[1][j] + p;
                integerPart = integerPart / 10;
            }
            s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
        }
        return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
    }
}

字符串工具类 


package com.ruoyi.common.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.util.AntPathMatcher;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.text.StrFormatter;

/**
 * 字符串工具类
 * 
 * @author ruoyi
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils
{
    /** 空字符串 */
    private static final String NULLSTR = "";

    /** 下划线 */
    private static final char SEPARATOR = '_';

    /**
     * 获取参数不为空值
     * 
     * @param value defaultValue 要判断的value
     * @return value 返回值
     */
    public static <T> T nvl(T value, T defaultValue)
    {
        return value != null ? value : defaultValue;
    }

    /**
     * * 判断一个Collection是否为空, 包含List,Set,Queue
     * 
     * @param coll 要判断的Collection
     * @return true:为空 false:非空
     */
    public static boolean isEmpty(Collection<?> coll)
    {
        return isNull(coll) || coll.isEmpty();
    }

    /**
     * * 判断一个Collection是否非空,包含List,Set,Queue
     * 
     * @param coll 要判断的Collection
     * @return true:非空 false:空
     */
    public static boolean isNotEmpty(Collection<?> coll)
    {
        return !isEmpty(coll);
    }

    /**
     * * 判断一个对象数组是否为空
     * 
     * @param objects 要判断的对象数组
     ** @return true:为空 false:非空
     */
    public static boolean isEmpty(Object[] objects)
    {
        return isNull(objects) || (objects.length == 0);
    }

    /**
     * * 判断一个对象数组是否非空
     * 
     * @param objects 要判断的对象数组
     * @return true:非空 false:空
     */
    public static boolean isNotEmpty(Object[] objects)
    {
        return !isEmpty(objects);
    }

    /**
     * * 判断一个Map是否为空
     * 
     * @param map 要判断的Map
     * @return true:为空 false:非空
     */
    public static boolean isEmpty(Map<?, ?> map)
    {
        return isNull(map) || map.isEmpty();
    }

    /**
     * * 判断一个Map是否为空
     * 
     * @param map 要判断的Map
     * @return true:非空 false:空
     */
    public static boolean isNotEmpty(Map<?, ?> map)
    {
        return !isEmpty(map);
    }

    /**
     * * 判断一个字符串是否为空串
     * 
     * @param str String
     * @return true:为空 false:非空
     */
    public static boolean isEmpty(String str)
    {
        return isNull(str) || NULLSTR.equals(str.trim());
    }

    /**
     * * 判断一个字符串是否为非空串
     * 
     * @param str String
     * @return true:非空串 false:空串
     */
    public static boolean isNotEmpty(String str)
    {
        return !isEmpty(str);
    }

    /**
     * * 判断一个对象是否为空
     * 
     * @param object Object
     * @return true:为空 false:非空
     */
    public static boolean isNull(Object object)
    {
        return object == null;
    }

    /**
     * * 判断一个对象是否非空
     * 
     * @param object Object
     * @return true:非空 false:空
     */
    public static boolean isNotNull(Object object)
    {
        return !isNull(object);
    }

    /**
     * * 判断一个对象是否是数组类型(Java基本型别的数组)
     * 
     * @param object 对象
     * @return true:是数组 false:不是数组
     */
    public static boolean isArray(Object object)
    {
        return isNotNull(object) && object.getClass().isArray();
    }

    /**
     * 去空格
     */
    public static String trim(String str)
    {
        return (str == null ? "" : str.trim());
    }

    /**
     * 截取字符串
     * 
     * @param str 字符串
     * @param start 开始
     * @return 结果
     */
    public static String substring(final String str, int start)
    {
        if (str == null)
        {
            return NULLSTR;
        }

        if (start < 0)
        {
            start = str.length() + start;
        }

        if (start < 0)
        {
            start = 0;
        }
        if (start > str.length())
        {
            return NULLSTR;
        }

        return str.substring(start);
    }

    /**
     * 截取字符串
     * 
     * @param str 字符串
     * @param start 开始
     * @param end 结束
     * @return 结果
     */
    public static String substring(final String str, int start, int end)
    {
        if (str == null)
        {
            return NULLSTR;
        }

        if (end < 0)
        {
            end = str.length() + end;
        }
        if (start < 0)
        {
            start = str.length() + start;
        }

        if (end > str.length())
        {
            end = str.length();
        }

        if (start > end)
        {
            return NULLSTR;
        }

        if (start < 0)
        {
            start = 0;
        }
        if (end < 0)
        {
            end = 0;
        }

        return str.substring(start, end);
    }

    /**
     * 格式化文本, {} 表示占位符<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例:<br>
     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
     * 
     * @param template 文本模板,被替换的部分用 {} 表示
     * @param params 参数值
     * @return 格式化后的文本
     */
    public static String format(String template, Object... params)
    {
        if (isEmpty(params) || isEmpty(template))
        {
            return template;
        }
        return StrFormatter.format(template, params);
    }

    /**
     * 是否为http(s)://开头
     * 
     * @param link 链接
     * @return 结果
     */
    public static boolean ishttp(String link)
    {
        return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS);
    }

    /**
     * 字符串转set
     * 
     * @param str 字符串
     * @param sep 分隔符
     * @return set集合
     */
    public static final Set<String> str2Set(String str, String sep)
    {
        return new HashSet<String>(str2List(str, sep, true, false));
    }

    /**
     * 字符串转list
     * 
     * @param str 字符串
     * @param sep 分隔符
     * @param filterBlank 过滤纯空白
     * @param trim 去掉首尾空白
     * @return list集合
     */
    public static final List<String> str2List(String str, String sep, boolean filterBlank, boolean trim)
    {
        List<String> list = new ArrayList<String>();
        if (StringUtils.isEmpty(str))
        {
            return list;
        }

        // 过滤空白字符串
        if (filterBlank && StringUtils.isBlank(str))
        {
            return list;
        }
        String[] split = str.split(sep);
        for (String string : split)
        {
            if (filterBlank && StringUtils.isBlank(string))
            {
                continue;
            }
            if (trim)
            {
                string = string.trim();
            }
            list.add(string);
        }

        return list;
    }

    /**
     * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写
     *
     * @param cs 指定字符串
     * @param searchCharSequences 需要检查的字符串数组
     * @return 是否包含任意一个字符串
     */
    public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences)
    {
        if (isEmpty(cs) || isEmpty(searchCharSequences))
        {
            return false;
        }
        for (CharSequence testStr : searchCharSequences)
        {
            if (containsIgnoreCase(cs, testStr))
            {
                return true;
            }
        }
        return false;
    }

    /**
     * 驼峰转下划线命名
     */
    public static String toUnderScoreCase(String str)
    {
        if (str == null)
        {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        // 前置字符是否大写
        boolean preCharIsUpperCase = true;
        // 当前字符是否大写
        boolean curreCharIsUpperCase = true;
        // 下一字符是否大写
        boolean nexteCharIsUpperCase = true;
        for (int i = 0; i < str.length(); i++)
        {
            char c = str.charAt(i);
            if (i > 0)
            {
                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
            }
            else
            {
                preCharIsUpperCase = false;
            }

            curreCharIsUpperCase = Character.isUpperCase(c);

            if (i < (str.length() - 1))
            {
                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
            }

            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
            {
                sb.append(SEPARATOR);
            }
            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
            {
                sb.append(SEPARATOR);
            }
            sb.append(Character.toLowerCase(c));
        }

        return sb.toString();
    }

    /**
     * 是否包含字符串
     * 
     * @param str 验证字符串
     * @param strs 字符串组
     * @return 包含返回true
     */
    public static boolean inStringIgnoreCase(String str, String... strs)
    {
        if (str != null && strs != null)
        {
            for (String s : strs)
            {
                if (str.equalsIgnoreCase(trim(s)))
                {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
     * 
     * @param name 转换前的下划线大写方式命名的字符串
     * @return 转换后的驼峰式命名的字符串
     */
    public static String convertToCamelCase(String name)
    {
        StringBuilder result = new StringBuilder();
        // 快速检查
        if (name == null || name.isEmpty())
        {
            // 没必要转换
            return "";
        }
        else if (!name.contains("_"))
        {
            // 不含下划线,仅将首字母大写
            return name.substring(0, 1).toUpperCase() + name.substring(1);
        }
        // 用下划线将原始字符串分割
        String[] camels = name.split("_");
        for (String camel : camels)
        {
            // 跳过原始字符串中开头、结尾的下换线或双重下划线
            if (camel.isEmpty())
            {
                continue;
            }
            // 首字母大写
            result.append(camel.substring(0, 1).toUpperCase());
            result.append(camel.substring(1).toLowerCase());
        }
        return result.toString();
    }

    /**
     * 驼峰式命名法 例如:user_name->userName
     */
    public static String toCamelCase(String s)
    {
        if (s == null)
        {
            return null;
        }
        s = s.toLowerCase();
        StringBuilder sb = new StringBuilder(s.length());
        boolean upperCase = false;
        for (int i = 0; i < s.length(); i++)
        {
            char c = s.charAt(i);

            if (c == SEPARATOR)
            {
                upperCase = true;
            }
            else if (upperCase)
            {
                sb.append(Character.toUpperCase(c));
                upperCase = false;
            }
            else
            {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
     * 
     * @param str 指定字符串
     * @param strs 需要检查的字符串数组
     * @return 是否匹配
     */
    public static boolean matches(String str, List<String> strs)
    {
        if (isEmpty(str) || isEmpty(strs))
        {
            return false;
        }
        for (String pattern : strs)
        {
            if (isMatch(pattern, str))
            {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断url是否与规则配置: 
     * ? 表示单个字符; 
     * * 表示一层路径内的任意字符串,不可跨层级; 
     * ** 表示任意层路径;
     * 
     * @param pattern 匹配规则
     * @param url 需要匹配的url
     * @return
     */
    public static boolean isMatch(String pattern, String url)
    {
        AntPathMatcher matcher = new AntPathMatcher();
        return matcher.match(pattern, url);
    }

    @SuppressWarnings("unchecked")
    public static <T> T cast(Object obj)
    {
        return (T) obj;
    }
}

字符串格式化工具 

package com.ruoyi.common.core.text;

import com.ruoyi.common.utils.StringUtils;

/**
 * 字符串格式化
 * 
 * @author ruoyi
 */
public class StrFormatter
{
    public static final String EMPTY_JSON = "{}";
    public static final char C_BACKSLASH = '\\';
    public static final char C_DELIM_START = '{';
    public static final char C_DELIM_END = '}';

    /**
     * 格式化字符串<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例:<br>
     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
     * 
     * @param strPattern 字符串模板
     * @param argArray 参数列表
     * @return 结果
     */
    public static String format(final String strPattern, final Object... argArray)
    {
        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
        {
            return strPattern;
        }
        final int strPatternLength = strPattern.length();

        // 初始化定义好的长度以获得更好的性能
        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);

        int handledPosition = 0;
        int delimIndex;// 占位符所在位置
        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
        {
            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
            if (delimIndex == -1)
            {
                if (handledPosition == 0)
                {
                    return strPattern;
                }
                else
                { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
                    sbuf.append(strPattern, handledPosition, strPatternLength);
                    return sbuf.toString();
                }
            }
            else
            {
                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
                {
                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
                    {
                        // 转义符之前还有一个转义符,占位符依旧有效
                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
                        handledPosition = delimIndex + 2;
                    }
                    else
                    {
                        // 占位符被转义
                        argIndex--;
                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
                        sbuf.append(C_DELIM_START);
                        handledPosition = delimIndex + 1;
                    }
                }
                else
                {
                    // 正常占位符
                    sbuf.append(strPattern, handledPosition, delimIndex);
                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
                    handledPosition = delimIndex + 2;
                }
            }
        }
        // 加入最后一个占位符后所有的字符
        sbuf.append(strPattern, handledPosition, strPattern.length());

        return sbuf.toString();
    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目介绍: 一款商城购物 App,商品数据采用 Python 爬虫爬取自某小型电商平台,服务端部署在腾讯云。项目主要分为:主页、分类、购物车、消息、和“我的”模块。特点 采用 Kotlin 语言进行开发 采用 MVP + dagger 2 架构 组件化开发,减少模块间的耦合 采用 Retrofit + RxKotlin 进行网络请求 使用 ARouter 进行页面路由和 EventBus 进行全局事件广播 使用到的第三方开源库 项目名称 简介 RxKotlin RxJava bindings for Kotlin RxAndroid 在 Android 中使用 RxJava ARouter 帮助 Android App 进行组件化改造的路由框架 Retrofit HTTP 请求工具库 OkHttp 适用于 Android 和 Java 应用的网络请求框架 Dagger 强大的依赖注入框架 Glide 好用的图片加载框架 CircleImageView 圆形图片不复杂 MultiStateView 通用状态切换视图 RxBus 适用于 Kotlin 的 RxBus FlowLayout Android 流式布局,支持单选、多选等,适合用于产品标签等 leakcanary 使用于 Android 和 Java 和内存泄漏检查工具 BadgeView 支持自由定制外观、拖拽消除的 MaterialDesign 风格 Android BadgeView使用到的工具/网站 网站名称 简介 Iconfont 阿里巴巴矢量图标库,提供了本项目中的大部分矢量图 aconvert 在线调整图片大小(PNG, JPG 和 GIF) convertio 在线图像文件转换,支持 SVG 转换成 PNG logoko 在线 logo 设计 图帮主 在线平面设计 shields metadata 图标设计 compresspng 在线压缩 PNG 图像
Chapter 1:Refactoring,a First Example 重构,第一个例子   The Starting Point 起点   The First Step in Refactoring 重构第一步   Decomposing and Redistributing the Statement Method 分解并重组slalemenl方法   Replacing the Conditional Logic on Price Code with Polymorphism 用多态代替价格条件逻辑代码   Final Thoughts 结语  Chapter 2:Principles in Refactoring 重构原则   Defining Refactoring 何谓重构   Why Should You Refactor? 为何重构   When Should You Refactor? 何时重构   What Do I Tell My Manager? 怎样说服经理   Problems with Refactoring 重构的问题   Refactoring and Design 重构与设计   Refactoring and Performance 重构与性能   Where Did Refactoring Come From? 重构的起源  Chapter 3:Bad Smells in Code(by Kent Beck and Martin Fowler) 代码坏昧   Duplicated Code 重复代码   Long Method 过长方法   Large Class 过长类   Long Parameter List 过长参数列表   Divergent Change 发散式变化   Shotgun Surgery 霰弹式修改   Feature Envy 特性依恋   Data Clumps 数据泥团   Primitive Obsession 基本类型偏执   Switch Statements switch语句   Parallel Inheritance Hierarchies 平行继承体系   Lazy Class 冗余类   Speculative Generality 理论上的一般性   Temporary Field 临时字段   Message Chains 消息链   Middle Man 中间人   Inappropriate Intimacy 过度亲密   Alternative Classes with Different Interfaces 接口不同的等效类  Incomplete Library Class 不完整的库类   Data Class 数据类   Refused Bequest 拒绝继承   Comments 注释过多  Chapter 4:Building Tests 构建测试   The Value of Self-testing Code 自测试代码的重要性   The JUnit Testing Framework Junit测试框架   Adding More Tests 添加更多测试  Chapter 5:Toward a Catalog of Refactorings 重构目录   Format of the Refactorings 重构描述的格式   Finding References 寻找引用   How Mature Are These Refactorings? 这些重构的成熟度如何 Chapter 6:Composing Methods 组合方法   Extract Method 提取方法   Inline Method 内联方法   Inline Temp 内联临时变量   *Replace Temp with Query 用查询方法代替临时变量   Introduce Explaining Variable 引入解释性变量   Split Temporary Variable 分离临时变量   *Remove Assignments to Parameters 去除参数赋值   Replace Method with Method Object 用方法对象代替方法   Substitute Algorithm 替换算法  Chapter 7:Moving Features Between Objects 在对象之间移动特性  *Move Method 移动方法   Move Field 移动字段   Extract Class 提取类   Inline Class 内联类   Hide Delegate 隐藏委托类   Remove Middle Man 去除中间人   Introduce Foreign Method 引入外加方法   *Introduce Local Extension 引入本地扩展类  Chapter 8:Organizing Data 组织数据   Self Encapsulate Field 自封装字段   Replace Data Value with Object 用对象代替数据值   Change Value to Reference 将值对象改为引用对象   Change Reference to Value 将引用对象改为值对象   Replace Array with Object 用对象代替数组   Duplicate Observed Data 重复被观察数据   *Change Unidirectional Associationto Bidirectional 将单向关联改为双向   Change Bidirectional Association to Unidirectional 将双向关联改为单向   *Replace Magic Number with Symbolic Constant 用字面常量代替魔数   Encapsulate Field 封装字段   Encapsulate Collection 封装集合   Replace Record with Data Class 用数据类代替记录   *ReplaceType Code with Class 用类代替类型码   Replace Type Code with Subclasses 用子类代替类型码   Replace Type Code with State/Strategy用State/Strategy 代替类型码   Replace Subclass with Fields 用字段代替子类  Chapter 9:Simplifying Conditional Expressions 简化条件语句   Decompose Conditional 分解条件语句   Consolidate Conditional Expression 合并条件语句   Consolidate Duplicate Conditional Fragments 合并重复的条件片段   Remove Control Flag 去除控制标志   Replace Nested Conditional with Guard Clauses 用守卫语句代替嵌套条件语句   Replace Conditional with Polymorphism 用多态代替条件语句   Introduce Null Object 引入Null对象   Introduce Assertion 引入断言  Chapter 10:Making Method Calls Simpler 简化方法调用   Rename Method 重命名方法   Add Parameter 添加参数   Remove Parameter 去除参数   Separate query from Modifier 将查询方法与修改方法分离   Parameterize Method 参数化方法   Replace Parameter with Explicit Methods 用显式方法代替参数  Preserve Whole Object 保持对象完整   Replace Parameter with Method 用方法代替参数   Introduce Parameter Object 引入参数对象   Remove Setting Method 去除设置方法   Hide Method 隐藏方法   Replace Constructor with Factory Method 用工厂方法代替构造   Encapsulate Downcast 封装向下转型   Replace Error Code with Exception 用异常代替错误码   Replace Exception with Test 用测试代替异常  Chapter 11:Dealing with Generalization 处理泛化关系   Pull Up Field 上移字段   Pull UP Method 上移方法   Pull Up Constructor Body 上移构造主体   Push Down Method 下移方法   Push Down Field 下移字段   Extract Subclass 提取子类   Extract Superclass 提取超类   Extract Interface 提取接口   Collapse Hierarchy 合并继承层次   Form Template Method 形成Template Method   Replace Inheritance with Delegation 用委托代替继承   Replace Delegation with Inheritance 用继承代替委托  Chapter 12:Big Refactorings(by Kent Beck and Martin Fowler) 大型重构   Tease Apart Inheritance 分解继承层次   Convert Procedural Design to Objects 将过程式设计转换为面向对象   Separate Domain from Presentation 将领域逻辑与表现分离   Extract Hierarchy 提取继承层次  Chapter 13:Refactoring,Reuse,and Reality(by William Opdyke) 重构,复用与现实   A Reality Check 现实的检验   Whv Are Developers Reluctant to Refactor Their Programs? 开发人员为何不愿重构程序   A Reality Check(Revisited) 再谈现实的检验   Resources and References for Refactoring 重构的资源和参考文献   Implications Regarding Software Reuse and Technology Transfer 对软件复用与技术传播的意义   A Final Note 结语   References 参考文献  Chapter 14:Refactoring Tools(by Don Roberts and John Brant) 重构工具   Refactoring with a Tool 使用工具重构   Technical Criteria for a Refactoring Tool 重构工具的技术标准   Practical Criteria for a Refactoring Tool 重构工具的实用标准   Wrap Up 结语  Chapter 15:Putting It All Together(by Kent Beck) 集大成  References参考文献  List of Soundbites 要点列表  Updates 更新内容  Index 索引
第1章 Java概述、安装及简易教学 14 1-1 Java概述 14 1-2 Java安装 16 1-3 Eclipse安装 18 1-4 GUI设计工具WindowBuilder 18 1-5 在Eclipse开发第一个Java程式 23 1-6 在Eclipse开发第一个Java视窗程式-显示影像 26 1-7 在Eclipse开发视窗程式-slider控制元件 34 1-8 在Eclipse开发视窗程式-按钮控制元件 39 1-9 好用的Eclipse热键 41 第2章 OpenCV概述、安装及设定 42 2-2 关于OpenCV 3.0及3.1 43 2-3 使用Java开发OpenCV的缺点 45 2-4 OpenCV的下载及安装 45 2-5 Eclipse设定OpenCV开发环境 46 2-6 整合Java之Eclipse与OpenCV 49 2-7 开发第一个OpenCV程式 51 2-8 建立矩阵 52 范例2-8-1 建立第一个opencv的矩阵,使用阵列 53 范例2-8-2 建立opencv的Mat矩阵方法2 55 范例2-8-3 方法3以单一元素指定 56 范例2-8-4 方法4全部以同一元素指定 57 范例2-8-5 方法5以个别单一元素指定 58 范例2-8-6 方法6以1维阵列指定建立 59 第3章 OpenCV基础数学计算 60 范例3-1-1 矩阵的线性代数计算1 60 范例3-1-2 矩阵的矩阵线性代数计算2-加减乘除处理 62 范例3-1-3 矩阵的矩阵线性代数计算3 65 范例3-2-1 矩阵的统计方面计算1 68 范例3-2-2矩阵的统计方面计算2 69 范例3-3-1 矩阵其他数学计算 72 第4章 影像基本输出输入处理 78 范例4-1-1 Opencv读取写入练习 79 范例4-1-2 Opencv读取影像并显示至视窗 81 范例4-1-3 Opencv读取影像显示至视窗-版本2 84 范例4-1-4影像储存压缩品质选择 87 范例4-2-1 Opencv使用webcam拍照,并存放置资料匣 89 范例4-2-2 使用webcam拍照明亮版-并存放影像在资料匣 90 范例4-2-3 使用webcam读取动态影像至Java Swing视窗 91 范例4-2-4 使用webcam读取动态影像至Java Swing视窗2 92 范例4-2-5 手动拍照 94 范例4-2-6 使用webcam录制影片档 96 范例4-2-7 使用xuggle录制电脑画面 99 范例4-2-8 使用Opencv API录制影片档案 102 范例4-3-1 Opencv API拨放影片档案,使用Panel 104 范例4-3-2 Opencv API拨放影片档案,不使用Panel 105 范例4-4-1从IPCam读取网路串流影像 107 范例4-4-2从IPCam拍摄照片 108 第5章 影像基本处理 109 范例5-1-1使用ConvertTo调整影像明亮度 109 范例5-1-2使用ConvertTo及GUI元件调整影像明暗度 110 范例5-1-3使用addWeighted及GUI元件调整影像明亮度 111 范例5-1-4改变影像的每1个像素调整影像明亮度 112 范例5-2-1全彩图转灰阶图 113 范例5-3-1影像颜色相反,使用Bitwise_xor 114 范例5-3-2影像颜色相反,使用subtract 115 范例5-3-3影像颜色相反,使用Bitwise_not 116 范例5-4-1模糊处理-使用Gaussian高斯函数及GUI元件 116 范例5-4-2修正5-4-1高斯模糊的异常 117 范例5-4-3模糊处理-使用median函数及GUI元件 118 范例5-4-4模糊处理-使用BoxFilter函数及GUI元件 119 范例5-5-1 Threshold-使用临界值函数及GUI元件 122 范例5-5-2 AdaptiveThreshold-使用自适临界值及GUI元件 128 范例5-6-1 Sharpness锐利化处理 130 范例5-6-2锐利化处理,使用GUI元件 131 范例5-7-1 影像合并/融合处理处理,使用GUI元件 131 范例5-8-1 影像缩放-使用Gaussian高斯金字塔及GUI元件 133 范例5-8-2影像缩放-使用resize使用GUI元件 135 范例5-8-3 影像延展效果-使用resize使用GUI元件 136 范例5-8-4影像缩放-使用getRotationMatrix2D及GUI元件 137 范例5-9-1影像旋转以90度*n为主-使用remap及 GUI元件 138 范例5-9-2影像旋转以90度*n为主-使用Flip及 GUI元件 140 范例5-9-3 影像可任意角度旋转缩放使用 GUI元件 141 范例5-10-1 影像扭曲倾斜处理使用GUI元件 143 范例5-11-1 灰阶影像对比强化处理并GUI显示 147 范例5-11-2 影像强化对比效果,使用均衡化直方图 149 范例5-11-3 RGB彩色强化对比效果,使用均衡化直方图及融合 150 范例5-11-4 YUV彩色强化对比效果,使用均衡化直方图及融合 151 范例5-12-1 影像梦幻沙龙处理使用GUI显示 152 范例5-13-1 影像各式颜色空间转换于GUI显示 154 范例5-14-1 影像堆叠 155 范例5-15-1 影像马赛克处理 157 范例5-16-1 影像添加外框 158 范例5-17-1合并两个影像 160 范例5-17-2合并两个影像,使用不规则形状 161 第6章 使用核矩阵进行影像处理 165 范例6-1-1 Mean filter处理 165 范例6-2-1 Prewitt Filter处理 167 范例6-3-1 Laplacian Filter处理1 170 范例6-3-2 Laplacian Filter处理2 171 范例6-3-3 Laplacian Filter灰阶影像处理 173 范例6-3-4 Laplacian Filter使用核矩阵 173 范例6-4-1 Sobel Filter使用核矩阵 175 范例6-4-2 Sobel Filter处理使用内建API 176 范例6-4-3 Sobel Filter处理使用内建API2 178 范例6-5-1 Frei Chenn Filter处理 180 范例6-6-1 Scharr Filter使用核矩阵 180 范例6-6-2 Scharr使用API 181 范例6-7-1 Robinson Filter处理 182 范例6-8-1 Kirsch Filter处理 184 范例6-9-1 Emboss浮雕处理 186 范例6-10-1 创造自己的filter 187 范例6-11-1 SqrBoxFilter处理 188 第7章 绘图 190 范例7-1-1 画线 190 范例7-2-1 画点 191 范例7-3-1 画圆 191 范例7-4-1 画椭圆形 192 范例7-4-2 椭圆内近似多边形练习 194 范例7-5-1 填补凸多边形练习 195 范例7-6-1 多边形绘图(填满)练习 196 范例7-6-2 多边形填充使用滑鼠练习 197 范例7-7-1中空多边形绘图练习 198 范例7-8-1 输入文字练习 200 范例7-8-2 输入文字使用中文练习 202 范例7-8-3浮水印练习 205 范例7-9-1 矩形练习 206 范例7-9-2 判断A矩形是否有在B矩形内 207 范例7-10-1 综合应用:直方图统计练习 208 范例7-11-1 颜色洪水填充处理练习1 211 范例7-11-2 颜色洪水填充处理练习2 213 范例7-11-3 颜色洪水填充处理3-重拾小朋友填色乐趣. 214 范例7-12-1 综合练习:使用一个最小矩形包含一堆点 215 范例7-13-1 综合练习:使用一个最小矩形包含一堆矩形 216 范例7-14-1 综合练习:使用一个矩形撷取影像区块 218 范例7-14-2综合练习:中空多边形绘制使用滑鼠 220 范例7-14-3综合练习:使用多边形撷取不规则影像区块1 222 范例7-14-4 综合练习:使用多边形撷取不规则影像区块2 227 范例7-14-5 综合练习:使用多边形撷取影像贴至另一影像 228 范例7-15-1箭头练习 232 范例7-16-1 特殊符号练习 233 范例7-17-1 立体浮雕制作 235 第8章 进阶影像处理 241 范例8-1-1 Erosion腐蚀处理练习 241 范例8-2-1 Dilation膨胀处理练习 242 范例8-3-1 其他形态学变换处理练习 244 范例8-4-1 Canny边缘检测处理练习1 246 范例8-4-2 Canny边缘检测处理练习2 248 范例8-5-1 卡通化处理1,整合模糊及Canny 249 范例8-5-2 卡通化处理2 252 范例8-5-3 卡通化及线条Live版 253 范例8-6-1 抠出背景处理练习 254 范例8-7-1聚光灯效果处理练习 256 范例8-9-1 分水岭演算法Watershed处理练习 258 范例8-10-1 油画效果处理练习 261 范例8-11-1 多种色调处理练习 262 范例8-12-1 圆形转矩形处理练习 266 范例8-13-1 LogPolar极座标转换处理 267 第9章 强大相片类处理 270 范例9-1-1 影像修复功能处理练习 270 范例9-2-1 影像减色/脱色/降灰阶处理练习 272 范例9-3-1 消除杂点练习1 273 范例9-3-2 消除杂点练习2 274 范例9-3-3 消除杂点练习3 275 范例9-3-4 消除杂点练习4 276 范例9-4-1 HDR高动态范围成像练习 277 范例9-5-1 Seamless Cloning系列 Color Change练习 285 范例9-6-1 Illumination Change练习 287 范例9-7-1 Texture Flattening水彩化 288 范例9-7-2 水彩的世界-Live版 290 范例9-8-1 Seamless Cloning系列-澄清湖水怪无缝贴图 290 范例9-8-2 Seamless Cloning系列-背景练习 295 范例9-8-3 综合练习:使用多边形撷取无缝贴图实作练习 296 范例9-9-1 Non-Photorealistic Rendering非实感绘制-强化 300 范例9-10-1 非实感绘制系列-模糊影像边缘保留处理 301 范例9-11-1 非实感绘制系列-铅笔处理 302 范例9-12-1 非实感绘制系列-写实风格化 304 范例9-12-2 写实风格化Live版 305 范例9-13-1 具限制性对比度自适应直方图均衡CLAHE 306 范例9-14-1 影像形状自动校正 308 范例9-14-2 影像角度自动校正 311 第10章 检测 314 范例10-1-1 Hough Line霍夫线变换1 314 范例10-1-2 Hough Line霍夫线变换2 317 范例10-1-3线段检测 319 范例10-2-1 Hough Circle霍夫圆变换 321 范例10-2-2霍夫圆变换应用:距离量测使用Cam实作 324 范例10-2-3 综合应用-虚拟画笔Live版1 327 范例10-2-4 虚拟画笔Live版2 330 范例10-3-1 寻找轮廓 332 范例10-3-2 轮廓顺序表示法 334 范例10-4-1 寻找轮廓并且绘出外框矩形1 336 范例10-4-2 寻找轮廓并且绘出外框矩形2 338 范例10-4-3 多点绘出外框矩形1 341 范例10-4-4 多点绘出外框矩形2 342 范例10-4-5 多点绘出外框凸多边形 343 范例10-4-6 绘出多点外框圆形 345 范例10-4-7 绘出多点外框椭圆形 346 范例10-4-8 最近似外框多边形 347 范例10-4-9 绘出多点最适外框三角形 349 范例10-5-1寻找轮廓并且绘出外框圆形 351 范例10-5-2寻找轮廓并且绘出外框椭圆形 352 范例10-5-3寻找轮廓并且绘出外框三角形 354 范例10-6-1判断某点是否在凸边形的轮廓内 356 范例10-7-1计算轮廓的面积与周长 357 范例10-8-1使用匹配模板找出某物 359 范例10-8-2使用非匹配模板找出某物 363 范例10-8-3 修正使用匹配与非匹配模板找出某物 364 范例10-9-1 convexHull凸包处理 367 范例10-10-1 convexityDefects凸包缺陷 369 范例10-11-1颜色区域检测 373 范例10-12-1颜色辨识-反向投影1 377 范例10-12-2颜色辨识-反向投影2 379 范例10-12-3颜色辨识-反向投影3 380 范例10-13-1颜色辨识以RGB为主 381 范例10-13-2颜色辨识,使用HSV彩色空间 382 范例10-13-3影像颜色检测 384 范例10-14-1从webcam读取影像及判断HSV颜色值 385 范例10-14-2读取影像及调整HSV颜色值捕捉物体 387 范例10-14-3计算生锈面积 389 范例10-15-1综合应用,辨识蓝色圆形物 390 范例10-15-2综合应用:辨识蓝色圆形物-增加膨胀以改良 393 范例10-16-1找出肤色Live版 395 范例10-16-2找出肤色Live改善版 396 范例10-17-1手势、手指数目辨识 397 范例10-17-2手势控制相机先比5后比Ya(2指)触发自动拍照 406 范例10-18-1 Xray效果及找到手掌心 407 范例10-18-2找到手掌心 Live版 410 范例10-18-3找到掌心与手指 Live版 411 范例10-19-1 空间矩、中心矩、标准中心矩及Hu不变矩 411 范例10-19-2比较两个形状 416 范例10-19-3比较两个影像,使用直方图比对法 419 范例10-19-4找出某物整合MatchTemplete与compareHist 422 范例10-20-1 找出合适的切线 425 范例10-20-2 众点找出合适的切线 428 范例10-21-1束绳检测是否断裂1 430 范例10-21-2束绳检测是否断裂2 432 范例10-21-3束绳检测是否断裂3 433 范例10-22-1束绳检测是否偏斜1 435 范例10-22-2束绳检测是否偏斜2 437 范例10-22-3束绳检测是否偏斜3 439 范例10-23-1 综合应用:找出趋势图最高点 441 范例10-24-1寻找两个矩形的交叉点 442 范例10-25-1 捕抓萤幕画面 444 范例10-25-2找出应用程式在萤幕的位置-我的Word在那里 446 第11章 特征点检测 450 范例11-1-1 Shi-Tomasi角点检测方法 450 范例11-1-2利用角点检测找出particle-Live版 452 范例11-2-1 Harris-Stephens边缘检测方法 453 范例11-3-1更精确的角点检测 454 范例11-4-1特征点检测计算 457 范例11-5-1利用Features2D二维特征点寻找物体 462 范例11-5-2利用二维特征点SURF+FLANN寻找物体-Live版 468 范例11-5-3利用Features2D寻找近似物体 468 范例11-6-1利用二维特征点及Homography单映射寻找物体 472 范例11-6-2利用二维特征点及单映射寻找物体Live版 476 范例11-6-3利用二维特征点及单映射寻找近似物体 476 范例11-7-1客制化角点检测视窗 477 范例11-8-1寻找出棋盘格 480 范例11-8-2寻找出棋盘格Live版 483 范例11-9-1矫正镜头畸形 483 范例11-9-1利用矫正镜头制造艺术化扭曲影像 487 第12章 运动追踪motion tracking 489 范例12-1-1补捉动静Live版 489 范例12-2-1使用HOG特征进行行人检测 491 范例12-2-2行人检测Live版 494 范例12-3-1 Lucas-Kanade光流 494 范例12-3-2 Farneback光流 499 范例12-4-1使用MOG特征进行行人检测 502 范例12-4-2 MOG特征进行行人检测Live版 504 范例12-4-3使用KNN特征进行行人检测 505 范例12-4-4 KNN特征进行行人检测Live版 506 范例12-5-1使用Meanshift均值偏移寻找物体Live版 507 范例12-6-1使用CamShift人脸追踪Live版 509 范例12-7-1 Kalman Filter滤波,随机乱跑Live版 512 范例12-7-2 Kalman Filter滤波,追踪蓝色圆形Live版 516 范例12-8-1更新运动历史图像Live版 517 第13章 Machine Learning机学习 523 范例13-1-1人脸辨识 524 范例13-1-2人脸辨识Live版 527 范例13-1-3人脸辨识含眼鼻Live版 527 范例13-1-4人脸眼鼻快速辨识Live版 529 范例13-1-5 整合应用:检测到眼睛自动添加眼镜Live版 531 范例13-1-6检测到眼睛自动添加半透明眼镜Live版 534 范例13-1-7检测行人 535 范例13-1-8检测车辆 537 范例13-1-9 DetectMultiScale3参数测试 538 范例13-1-10计算车流量 540 范例13-1-11 侦测RJ45网路头Live版 542 范例13-2-1 电脑小手写板程式Live版 549 范例13-2-1a手写数字的资料库 552 范例13-2-1b鸢尾花资料库 555 范例13-3-1常态贝叶斯分类预测鸢尾花数据集 560 范例13-3-2常态贝叶斯分类-预测手写数字 561 范例13-3-3常态贝叶斯分类-预测手写数字Live版 563 范例13-4-1决策树Decision Trees预测鸢尾花数据集 565 范例13-4-2决策树-预测手写数字 569 范例13-4-3决策树-预测手写数字Live版 571 范例13-5-1最大期望值EM-预测鸢尾花数据集 572 范例13-5-2最大期望值-预测鸢尾花数据集二元分类 576 范例13-5-3最大期望值-预测鸢尾花数据集3类修改版 578 范例13-5-4最大期望值-预测手写数字 581 范例13-5-5最大期望值-预测手写数字(二元分类) 583 范例13-5-6最大期望值-预测手写数字Live版 586 范例13-6-1 Logistic回归-预测鸢尾花数据集 586 范例13-6-2 Logistic回归-预测手写数字 590 范例13-6-3 Logistic回归-预测手写数字,调整参数 593 范例13-6-4 Logistic回归-预测手写数字Live版 593 范例13-7-1 KNN-预测鸢尾花数据集 594 范例13-7-2 KNN-预测鸢尾花数据集2 597 范例13-7-3 KNN-预测手写数字 600 范例13-7-3 KNN-预测手写数字Live版 602 范例13-7-5 KNN-分类练习 602 范例13-8-1 随机森林-预测鸢尾花数据集 604 范例13-8-2随机森林-预测手写数字 607 范例13-8-3 随机森林-预测手写数字Live版 609 范例13-9-1 Boost分类-预测鸢尾花数据集 609 范例13-9-2 Boost分类-预测鸢尾花数据集2 612 范例13-9-3 Boost-预测手写数字 615 范例13-9-4 Boost-预测手写数字Live版 617 范例13-10-1 类神经网路-初声试啼小练习 618 范例13-10-2 类神经网路-预测鸢尾花数据集 623 范例13-10-3类神经网路-预测手写数字 625 范例13-10-4类神经网路-预测手写数字Live版 627 范例13-11-1 SVM-预测鸢尾花数据集 627 范例13-11-2 SVM预测手写数字 631 范例13-11-3 SVM预测手写数字Live版 633 范例13-11-4 SVM分类练习于2D平面 633 范例13-12-1 Kmean(K均值)简单分类 636 范例13-12-2 Kmean 1维数据分类 640 范例13-12-3 Kmean 2维数据分类 643 范例13-12-4 Kmean 应用于影像处理-减色处理 646 范例13-12-5 Kmean预测分类-鸢尾花数据集 648 范例13-12-6 Kmean预测分类-手写数字数据集 650 范例13-12-7 Kmean预测分类-手写数字Live版 652 范例13-13-1马氏距离 654 范例13-13-2马氏距离使用于-鸢尾花数据集 656 范例13-13-3马氏距离使用于-手写数字数据集 657 范例13-13-4修改马氏距离使用于-手写数字数据集 660 范例13-13-5修改马氏距离使用于-鸢尾花数据集 665 范例13-13-6修改版马氏距离使用于-预测手写数字Live版 666 范例13-14-1主成份分析PCA 671 范例13-14-2鸢尾花数据集使用PCA降维 673 范例13-14-3鸢尾花数据使用PCA降维整合Kmean聚类处理 675 范例13-14-4鸢尾花数据使用PCA降维整合Knn分类处理 678 范例13-14-5手写数字集使用PCA降维整合Kmean聚类处理 680 范例13-14-6 手写数字集使用PCA降维整合KNN及SVM分类 682 范例13-14-7 改善手写数字集使用PCA降维整合KNN及SVM 685 范例13-14-8 改善鸢尾花数据使用PCA降维整合KNN分类 689 范例13-14-9个人人脸辨识整合PCA与SVM计算 690 范例13-14-10个人人脸辨识整合PCA与LibSVM计算 694 范例13-15-0车牌辨识 699 范例13-15-1 Java呼叫外部命令Tesseract字符识别引擎 701 第14章 其它功能与整合效果 703 范例14-1-1离散傅立叶转换 703 范例14-2-1视差(视角不对称)使用BM 706 范例14-2-2视差(视角不对称)使用SGBM 708 范例14-3-1综合应用:虚拟钢琴Live版 710 范例14-4-1平面细分割使用Subdiv2D 711 范例14-4-2综合练习,平面细分割使用Subdiv2D应用于人脸 715 范例14-4-2综合练习,平面细分割应用人脸Live版 718 第15章 发行Java应用程式 721 第16章 Opencv与Web整合 723 范例16-1-1 Hello Opencv 723 范例16-1-2 利用opencv显示影像 726 范例16-1-3在Web上模糊处理 729 范例16-1-4 jsp应用模糊处理 730 附录A Opencv Mat资料结构列表 734 附录B Opencv色彩空间转换资料格式列表 736 附录C Iris鸢尾花数据集 743 附录D Opencv Java开发异常说明 748 附录E Opencv for Java 2.4.12与3.1差异 749 附录F Opencv相关网址 754
一个很强大的工具, 能将c#代码片段、文件甚至工程直接转换成java代码,并能彻底解决外部引用的DLL问题,最强的是支持c#工程的直接转换,生成的Java代码质量也很不错。软件已破解,去除了未注册版最多只能转换1000行的限制,亲测可用!压缩包内含帮助文档,不过由于软件的使用很简单,帮助文档基本可以忽略。(小提示:如无法运行,请确认是否安装了.NET framework) 下面是一些英文介绍: C# to Java Converter features include: 1. Folder conversion: Entire folders of C# code files are converted to Java code files.(文件夹转换) 2. Code snippet and file conversion: Our snippet conversion accuracy is outstanding and does not require you to insert entire methods or classes. Heuristics are used to convert code fragments wit h missing declarations. (代码片段和文件转换) 3. Full support for the latest .NET code syntax: Generics and other newer C# features are converted where possible to the Java equivalent.(全面支持最新版的.NET语法) 4. Conversion options: You can specify numerous conversion options via our Options dialog. Code formatting options, custom type & member replacements, custom string replacements, and miscellaneous options. (可以指定转换规则) 5. File comparison feature: After converting a project or folder, you can compare original and converted files side-by-side. Comparing converted code to original code.(原代码与转换后代码的比较) 6. Running from the command line: C# to Java Converter can be launched directly for a specific project, folder, or file conversion from the command line. Command line.(命令行执行) 其他一些特点: 1. Converts all versions of C# code (2002, 2003, 2005, 2008, and 2010) (可以转换所有版本的C#代码) 2. Evaluates all referenced assemblies and .NET projects in order to resolve external references more completely.(能彻底解决外部引用的dll类库) 3. Converts C# ref parameters using Java generics 4. Superb conversions of all types of arrays 5. Handles the numerous coding alternatives and ambiguities of C# code 6. Flawless conversion of all aspects of inheritance and interfaces 7. Allows custom replacement of strings in the final converted code 8. Accurate even with poorly formatted C# code

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值