Java 实用方法

2018-11-17  本文已影响0人  潜心之力
List集合随机排序
int size = list.size();
Random random = new Random();

for(int i = 0; i < size; i++) { -> 方式一
  int randomPos = random.nextInt(size);
  T temp = list.get(i);
  list.set(i, list.get(randomPos));
  list.set(randomPos, temp);
}
 
for(int i = 0; i < size; i++) { -> 方式二
  int randomPos = random.nextInt(size);
  Collections.swap(list, i, randomPos);
}

Collections.shuffle(list); -> 方式三

list.retainAll(LIST); -> 获取两个集合的交集
list.removeAll(LIST); -> 获取两个集合的差集
list.addAll(LIST); -> 获取两个集合的并集
removeAll + addAll = 无重复并集
验证手机号
private boolean isPhoneNumber(String phone) {
  String regex = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";
  return phone.matches(regex);
}
验证密码
private boolean isPassword(String str) {
  String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,18}$"; 
  return str.matches(regex) && str.length() >= 6 && str.length() <= 18;
}
字符串编码和解码
public static String UrlEncode(String content){
   try { -> Json字符串存入Cookie前需要编码
    return URLEncoder.encode(content,"UTF-8");
  } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    return "";
  }
}

public static String UrlDecode(String content){
   try { -> Json字符串从Cookie中取出时需要解码
    return URLDecoder.decode(content,"UTF-8");
  } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
  return "";
  }
}
UNICODE和中文互转
public static String decodeUnicode(String unicode) {
    StringBuffer sb = new StringBuffer();
    String[] hex = unicode.split("\\\\u",-1); -> 默认忽略空字符串,消除默认
    for (int i = 1; i < hex.length; i++) {
        int data = Integer.parseInt(hex[i], 16);
        sb.append((char) data);
    }
    return sb.toString();
}

public static String decodeUnicode2(String unicode) {
    int start = 0;
    int end = 0;
    final StringBuffer buffer = new StringBuffer();
    while (start > -1) {
        end = unicode.indexOf("\\u", start + 2);
        String charStr = null;
        if (end == -1) {
            charStr = unicode.substring(start + 2, unicode.length());
        } else {
            charStr = unicode.substring(start + 2, end);
        }
        char letter = (char) Integer.parseInt(charStr, 16);
        buffer.append(new Character(letter).toString());
        start = end;
    }
    return buffer.toString();
}

public static String decodeUnicode3(String unicode) {
    String[] strs = unicode.split("\\\\u",-1);
    String returnStr = "";
    for (int i = 1; i < strs.length; i++) {
        returnStr += (char) Integer.valueOf(strs[i], 16).intValue();
    }
    return returnStr;
}

private static String encodeUnicode(String content) {
    char[] chars = content.toCharArray();
    String returnStr = "";
    for (int i = 0; i < chars.length; i++) {
        returnStr += "\\u" + Integer.toString(chars[i], 16);
    }
    return returnStr;
}
显示具体时间
public static String showTime(Date date) {
    String r = "";
    if (date == null) return r;
    long nowTimeLong = System.currentTimeMillis();
    long currTimeLong = date.getTime();
    long result = Math.abs(nowTimeLong - currTimeLong);

    if (result < 60000) { -> 一分钟内
        long seconds = result / 1000;
        if (seconds == 0) {
            r = "刚刚";
        } else {
            r = seconds + "秒前";
        }
    } else if (result >= 60000 && result < 3600000) { -> 一小时内
        long seconds = result / 60000;
        r = seconds + "分钟前";
    } else if (result >= 3600000 && result < 86400000) { -> 一天内
        long seconds = result / 3600000;
        r = seconds + "小时前";
    } else if (result >= 86400000 && result < 1702967296) { -> 三十天内
        long seconds = result / 86400000;
        r = seconds + "天前";
    } else { -> 日期格式
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        r = format.format(date);
    }
    return r;
}
生成随机订单号
public static String generateOrderNumber() {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    String date = sdf.format(new Date());
    int index = (int) ((Math.random() * 9 + 1) * 1000);
    return "wjx_" + date + index;
}
集合中把相同元素归类并统计个数
List<Goods> real = new ArrayList<>(); -> 最终结果
List<Goods> cache = new ArrayList<>(); -> 缓存已有元素
int total = 0; -> 统计个数
for (int i = 0; i < goodsList.size(); i++) {
    Goods goods = goodsList.get(i);
    if (!cache.contains(goods)) {
        cache.add(goods);
        goods.setPresentCount(Collections.frequency(goodsList, goods));
        total += goods.getPresentCount();
        real.add(goods);
    }
}
BigDecimal的使用
MathContext context = new MathContext(3, RoundingMode.HALF_UP); -> 保留三位有效数字
BigDecimal decimal = new BigDecimal("1.23", context); -> 推荐使用字符串构建

public BigDecimal add(BigDecimal decimal1, BigDecimal decimal2) { -> 加法
    return decimal1.add(decimal2);
}

public BigDecimal subtract(BigDecimal decimal1, BigDecimal decimal2) { -> 减法
    return decimal1.subtract(decimal2);
}

public BigDecimal multiply(BigDecimal decimal1, BigDecimal decimal2) { -> 乘法
    return decimal1.multiply(decimal2);
}

public BigDecimal divide(BigDecimal decimal1, BigDecimal decimal2
, int scale, int mode) { -> 除法(除不尽会抛出异常需设置保留位数)
    return decimal1.divide(decimal2, scale, mode); -> 设置保留位数和取舍模式
}

public BigDecimal scale(BigDecimal decimal,int scale,int mode) { -> 设置精度
    return decimal.setScale(scale,mode);
}

decimal1.compareTo(decimal2); -> 比较大小
a = -1 , 表示decimal1小于decimal2;
a = 0 , 表示decimal1等于decimal2;
a = 1 , 表示decimal1大于decimal2;

DecimalFormat format = new DecimalFormat("0.00"); -> 自动补零
DecimalFormat format = new DecimalFormat("#.##"); -> 省略零
DecimalFormat format = new DecimalFormat("0"); -> 取整
format.format(total); -> 格式化Decimal

RoundingMode -> 精度取舍模式
BigDecimal straight = new BigDecimal("1.234567890"); -> 正数
BigDecimal burden = new BigDecimal("-1.234567890"); -> 负数

BigDecimal.ROUND_UP -> 被舍去部分大于零则进一位
straight = straight.setScale(8,BigDecimal.ROUND_UP); -> 1.23456789
straight = straight.setScale(1,BigDecimal.ROUND_UP); -> 1.3
burden = burden.setScale(8,BigDecimal.ROUND_UP); -> -1.23456789
burden = burden.setScale(1,BigDecimal.ROUND_UP); -> -1.3

BigDecimal.ROUND_DOWN -> 被舍去部分不进位
straight = straight.setScale(1,BigDecimal.ROUND_DOWN); -> 1.2
burden = burden.setScale(1,BigDecimal.ROUND_DOWN); -> -1.2

BigDecimal.ROUND_CEILING -> 向正无穷大舍入,值始终增大
straight = straight.setScale(8,BigDecimal.ROUND_CEILING); -> 1.23456789
straight = straight.setScale(1,BigDecimal.ROUND_CEILING); -> 1.3
burden = burden.setScale(8,BigDecimal.ROUND_CEILING); -> -1.23456789
burden = burden.setScale(1,BigDecimal.ROUND_CEILING); -> 1.2

BigDecimal.ROUND_FLOOR -> 向负无穷小舍入,值始终减少
straight = straight.setScale(1,BigDecimal.ROUND_FLOOR); -> 1.2
burden = burden.setScale(1,BigDecimal.ROUND_FLOOR); -> -1.3

BigDecimal.ROUND_HALF_UP -> 四舍五入
straight = straight.setScale(2,BigDecimal.ROUND_HALF_UP); -> 1.23
straight = straight.setScale(3,BigDecimal.ROUND_HALF_UP); -> 1.235
burden = burden.setScale(2,BigDecimal.ROUND_HALF_UP); -> -1.23
burden = burden.setScale(3,BigDecimal.ROUND_HALF_UP); -> -1.235

BigDecimal.ROUND_HALF_DOWN -> 五舍六入(大于0.5)
straight = straight.setScale(2,BigDecimal.ROUND_HALF_DOWN); -> 1.23
straight = straight.setScale(3,BigDecimal.ROUND_HALF_DOWN); -> 1.235
burden = burden.setScale(2,BigDecimal.ROUND_HALF_DOWN); -> -1.23
burden = burden.setScale(3,BigDecimal.ROUND_HALF_DOWN); -> -1.235

BigDecimal.ROUND_HALF_EVEN -> 银行家舍入法[四舍六入]
五分两种情况[精度末尾奇数(ROUND_HALF_UP)][(精度末尾奇数ROUND_HALF_DOWN)]
straight = straight.setScale(2,BigDecimal.ROUND_HALF_EVEN); -> 1.23
straight = straight.setScale(3,BigDecimal.ROUND_HALF_EVEN); -> 1.235
straight = straight.setScale(4,BigDecimal.ROUND_HALF_EVEN); -> 1.2346
burden = burden.setScale(2,BigDecimal.ROUND_HALF_EVEN); -> -1.23
burden = burden.setScale(3,BigDecimal.ROUND_HALF_EVEN); -> -1.235
burden = burden.setScale(4,BigDecimal.ROUND_HALF_EVEN); -> -1.2346

BigDecimal.ROUND_UNNECESSARY -> 不进行取舍,设置精度将抛出异常
隐藏敏感信息
StringBuilder builder = new StringBuilder(name.substring(0, 1));
builder.append("***");
builder.append(name.substring(name.length() - 2));
user.setName(builder.toString());
两个变量互换值
public void exchange(int a,int b){
    a = a+b;
    b = a-b;
    a = a-b;
}
输出0~1000,不使用循环和条件
public void print(int i){
    System.out.println(i);
    i = i/(1000-i); -> 递归终止条件
    print(i+1); -> 执行递归
}
换行串联文本
public static String connection(String... strings) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < strings.length; i++) {
        builder.append(strings[i]);
        if(i != strings.length-1){
            builder.append("\\r\\n");
        }
    }
    return builder.toString();
}
对象属性非空校验
private Map<String,Object> validate(Object object, List<String> list) throws Exception {
    Map<String, Object> map = new HashMap<>();
    BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass(), object.getClass().getSuperclass());
    PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
    for (int i = 0; i < descriptors.length; i++) {
        String propertyName = descriptors[i].getName();
        Method method = descriptors[i].getReadMethod();
        Object propertyValue = method.invoke(object);
        if (list.contains(propertyName)) {
            if (StringUtils.isEmpty(propertyValue)) {
                map.put("msg",propertyName +" is null");
                return map;
            }
        } else {
            if (propertyValue == null) {
                map.put("msg",propertyName +" is null");
                return map;
            }
        }
    }
    return map;
}

User user = new User(1,"wjx",null);
List<String> columns = Arrays.asList("id", "name" , "age");
Map<String,Object> map = validate(user,columns);
上一篇下一篇

猜你喜欢

热点阅读