package com.vincent.rsf.common.utils; import com.vincent.rsf.framework.common.Cools; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; /** * Created by vincent on 2023/3/14 */ public class Utils { /** * List转为树形结构 * * @param data List * @param parentId 顶级的parentId * @param parentIdMapper 获取parentId的Function * @param idMapper 获取id的Function * @param consumer 赋值children的Consumer * @param 数据的类型 * @param parentId的类型 * @return List */ public static List toTreeData(List data, R parentId, Function parentIdMapper, Function idMapper, BiConsumer> consumer) { List result = new ArrayList<>(); for (T d : data) { R dParentId = parentIdMapper.apply(d); if (parentId.equals(dParentId)) { R dId = idMapper.apply(d); List children = toTreeData(data, dId, parentIdMapper, idMapper, consumer); if(!children.isEmpty()) { consumer.accept(d, children); } result.add(d); } } return result; } public static void treeRemove(List list, String condition, Function fetcher, Function> childrenGetter) { Iterator iterator = list.iterator(); while (iterator.hasNext()) { T next = iterator.next(); List children = childrenGetter.apply(next); if (children != null && !children.isEmpty()) { treeRemove(children, condition, fetcher, childrenGetter); } else { if (!fetcher.apply(next).contains(condition)) { iterator.remove(); } } } } /** * 数组倒序 */ public static byte[] reverse(byte[] bytes) { if (bytes == null) return null; for (int start = 0, end = bytes.length - 1; start < end; start++, end--) { byte temp = bytes[end]; bytes[end] = bytes[start]; bytes[start] = temp; } return bytes; } /** * 截取数组 * @param bytes 原数组 * @param pos 定位(截取后包含定位点数据) * @param len 长度 * @return new arr */ public static byte[] slice(byte[] bytes, int pos, int len) { if (bytes == null || bytes.length == 0 || len == 0) { return new byte[0]; } if (pos + len > bytes.length) { throw new RuntimeException("com.vincent.rsf.common.utils ArrayIndexOutOfBoundsException\n" + "原数组 bytes 长度为 " + bytes.length + ",截取长度超过原数组!"); } byte[] arr = new byte[len]; System.arraycopy(bytes, pos, arr, 0, len); return arr; } public static byte[] sliceWithReverse(byte[] bytes, int pos, int len) { byte[] slice = slice(bytes, pos, len); reverse(slice); return slice; } public static byte[] merge(Object... objects) { int len = 0; for (Object object : objects) { if (object instanceof byte[]) { byte[] bytes = (byte[]) object; len += bytes.length; } if (object instanceof Byte) { len++; } } byte[] arr = new byte[len]; int idx = 0; for (Object object : objects) { if (object instanceof byte[]) { byte[] bytes = (byte[]) object; System.arraycopy(bytes, 0, arr, idx, bytes.length); idx += bytes.length; } if (object instanceof Byte) { byte[] bytes = new byte[] {(Byte) object}; System.arraycopy(bytes, 0, arr, idx, bytes.length); idx += bytes.length; } } return arr; } public static String join(T[] array, String seq) { StringBuilder sb = new StringBuilder(); if (array != null) { for (int i = 0; i < array.length; i++) { sb.append(array[i]); if (i < array.length - 1) { sb.append(seq); } } } return sb.toString(); } public static String zeroFill(String msg, Integer len) { len = Optional.ofNullable(len).orElse(16); if (msg.length() == len){ return msg; } else if (msg.length() > len){ return msg.substring(0, 16); } else { StringBuilder msgBuilder = new StringBuilder(msg); for (int i = 0; i 0 ? str.charAt(i - 1) : null; Character nextChar = i < str.length() - 1 ? str.charAt(i + 1) : null; if (null != preChar) { if (symbol == preChar) { if (null == nextChar || Character.isLowerCase(nextChar)) { c = Character.toLowerCase(c); } } else if (Character.isLowerCase(preChar)) { sb.append(symbol); if (null == nextChar || Character.isLowerCase(nextChar)) { c = Character.toLowerCase(c); } } else if (null == nextChar || Character.isLowerCase(nextChar)) { sb.append(symbol); c = Character.toLowerCase(c); } } else if (null == nextChar || Character.isLowerCase(nextChar)) { c = Character.toLowerCase(c); } } sb.append(c); } return sb.toString(); } } public static String toCamelCase(CharSequence name) { if (null == name) { return null; } else { String name2 = name.toString(); if (name2.contains("_")) { int length = name2.length(); StringBuilder sb = new StringBuilder(length); boolean upperCase = false; for(int i = 0; i < length; ++i) { char c = name2.charAt(i); if (c == '_') { upperCase = true; } else if (upperCase) { sb.append(Character.toUpperCase(c)); upperCase = false; } else { sb.append(Character.toLowerCase(c)); } } return sb.toString(); } else { return name2; } } } public static String sub(String str, Integer maxLen) { if (str.length() > maxLen) { return str.substring(0, maxLen); } return str; } public static String generateSeqNum(String lastSeqNum) { if (Cools.isEmpty(lastSeqNum)) { return zeroFill("1", 4); } else { int i = Integer.parseInt(lastSeqNum); if (i >= 9999) { return zeroFill("1", 4); } else { return zeroFill(String.valueOf(i+1), 4); } } } // pos start in 0 public static boolean getBit(byte b, int position) { if (position < 0 || position > 7) { throw new IllegalArgumentException("Bit position must be between 0 and 7"); } int mask = 1 << position; return (b & mask) != 0; } public static List singletonList(T o) { List list = new ArrayList<>(); list.add(o); return list; } public static String convertToSnakeCaseForOrderByStr(String input) { String[] parts = input.split("\\s+"); String fieldName = parts[0]; String order = parts.length > 1 ? parts[1] : ""; String snakeCaseField = fieldName.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase(); return snakeCaseField + (order.isEmpty() ? "" : " " + order); } }