资讯专栏INFORMATION COLUMN

非常实用的 Java 8 代码片段

mating / 3391人阅读

摘要:使用计算等于指定值的值的总数。检查是否短于给定的数组,并使用以便对其进行相应的切片或返回一个空数组。使用和使用递归公式计算一组数字的最大公约数。该方法使用左移运算符将与右侧的值位移。异常相关将异常堆栈跟踪转换为字符串。

</>复制代码

  1. 本文来自于我的慕课网手记:非常实用的 Java 8 代码片段,转载请保留链接 ;)
Array(数组相关) chunk

将数组分割成特定大小的小数组。

</>复制代码

  1. public static int[][] chunk(int[] numbers, int size) {
  2. return IntStream.iterate(0, i -> i + size)
  3. .limit((long) Math.ceil((double) numbers.length / size))
  4. .mapToObj(cur -> Arrays.copyOfRange(numbers, cur, cur + size > numbers.length ? numbers.length : cur + size))
  5. .toArray(int[][]::new);
  6. }
concat

</>复制代码

  1. public static T[] concat(T[] first, T[] second) {
  2. return Stream.concat(
  3. Stream.of(first),
  4. Stream.of(second)
  5. ).toArray(i -> (T[]) Arrays.copyOf(new Object[0], i, first.getClass()));
  6. }
countOccurrences

计算数组中某个值出现的次数。

使用 Arrays.stream().filter().count() 计算等于指定值的值的总数。

</>复制代码

  1. public static long countOccurrences(int[] numbers, int value) {
  2. return Arrays.stream(numbers)
  3. .filter(number -> number == value)
  4. .count();
  5. }
deepFlatten

数组扁平化。

使用递归实现,Arrays.stream().flatMapToInt()

</>复制代码

  1. public static int[] deepFlatten(Object[] input) {
  2. return Arrays.stream(input)
  3. .flatMapToInt(o -> {
  4. if (o instanceof Object[]) {
  5. return Arrays.stream(deepFlatten((Object[]) o));
  6. }
  7. return IntStream.of((Integer) o);
  8. }).toArray();
  9. }
difference

返回两个数组之间的差异。

从 b 中创建一个集合,然后在 a 上使用 Arrays.stream().filter() 只保留 b 中不包含的值。

</>复制代码

  1. public static int[] difference(int[] first, int[] second) {
  2. Set set = Arrays.stream(second).boxed().collect(Collectors.toSet());
  3. return Arrays.stream(first)
  4. .filter(v -> !set.contains(v))
  5. .toArray();
  6. }
differenceWith

从比较器函数不返回true的数组中筛选出所有值。

int的比较器是使用IntbinaryPerator函数来实现的。

使用 Arrays.stream().filter()Arrays.stream().noneMatch() 查找相应的值。

</>复制代码

  1. public static int[] differenceWith(int[] first, int[] second, IntBinaryOperator comparator) {
  2. return Arrays.stream(first)
  3. .filter(a ->
  4. Arrays.stream(second)
  5. .noneMatch(b -> comparator.applyAsInt(a, b) == 0)
  6. ).toArray();
  7. }
distinctValuesOfArray

返回数组的所有不同值。

使用 Arrays.stream().distinct() 去除所有重复的值。

</>复制代码

  1. public static int[] distinctValuesOfArray(int[] elements) {
  2. return Arrays.stream(elements).distinct().toArray();
  3. }
dropElements

移除数组中的元素,直到传递的函数返回true为止。返回数组中的其余元素。

使用数组循环遍历数组,将数组的第一个元素删除,直到函数返回的值为真为止。返回其余的元素。

</>复制代码

  1. public static int[] dropElements(int[] elements, IntPredicate condition) {
  2. while (elements.length > 0 && !condition.test(elements[0])) {
  3. elements = Arrays.copyOfRange(elements, 1, elements.length);
  4. }
  5. return elements;
  6. }
dropRight

返回一个新数组,从右边移除n个元素。

检查n是否短于给定的数组,并使用 Array.copyOfRange() 以便对其进行相应的切片或返回一个空数组。

</>复制代码

  1. public static int[] dropRight(int[] elements, int n) {
  2. if (n < 0) {
  3. throw new IllegalArgumentException("n is less than 0");
  4. }
  5. return n < elements.length
  6. ? Arrays.copyOfRange(elements, 0, elements.length - n)
  7. : new int[0];
  8. }
everyNth

返回数组中的每个第n个元素。

使用 IntStream.range().filter() 创建一个新数组,该数组包含给定数组的每个第n个元素。

</>复制代码

  1. public static int[] everyNth(int[] elements, int nth) {
  2. return IntStream.range(0, elements.length)
  3. .filter(i -> i % nth == nth - 1)
  4. .map(i -> elements[i])
  5. .toArray();
  6. }
indexOf

查找数组中元素的索引,在不存在元素的情况下返回-1。

使用 IntStream.range().filter() 查找数组中元素的索引。

</>复制代码

  1. public static int indexOf(int[] elements, int el) {
  2. return IntStream.range(0, elements.length)
  3. .filter(idx -> elements[idx] == el)
  4. .findFirst()
  5. .orElse(-1);
  6. }
lastIndexOf

查找数组中元素的最后索引,在不存在元素的情况下返回-1。

使用 IntStream.iterate().limit().filter() 查找数组中元素的索引。

</>复制代码

  1. public static int lastIndexOf(int[] elements, int el) {
  2. return IntStream.iterate(elements.length - 1, i -> i - 1)
  3. .limit(elements.length)
  4. .filter(idx -> elements[idx] == el)
  5. .findFirst()
  6. .orElse(-1);
  7. }
filterNonUnique

筛选出数组中的非唯一值。

对只包含唯一值的数组使用 Arrays.stream().filter()

</>复制代码

  1. public static int[] filterNonUnique(int[] elements) {
  2. return Arrays.stream(elements)
  3. .filter(el -> indexOf(elements, el) == lastIndexOf(elements, el))
  4. .toArray();
  5. }
flatten

使数组扁平。

使用 Arrays.stream().flatMapToInt().toArray() 创建一个新数组。

</>复制代码

  1. public static int[] flatten(Object[] elements) {
  2. return Arrays.stream(elements)
  3. .flatMapToInt(el -> el instanceof int[]
  4. ? Arrays.stream((int[]) el)
  5. : IntStream.of((int) el)
  6. ).toArray();
  7. }
flattenDepth

将数组压平到指定的深度。

</>复制代码

  1. public static Object[] flattenDepth(Object[] elements, int depth) {
  2. if (depth == 0) {
  3. return elements;
  4. }
  5. return Arrays.stream(elements)
  6. .flatMap(el -> el instanceof Object[]
  7. ? Arrays.stream(flattenDepth((Object[]) el, depth - 1))
  8. : Arrays.stream(new Object[]{el})
  9. ).toArray();
  10. }
groupBy

根据给定函数对数组元素进行分组。

使用 Arrays.stream().collect(Collectors.groupingBy()) 分组。

</>复制代码

  1. public static Map> groupBy(T[] elements, Function func) {
  2. return Arrays.stream(elements).collect(Collectors.groupingBy(func));
  3. }
initial

返回数组中除去最后一个的所有元素。

使用 Arrays.copyOfRange() 返回除最后一个之外的所有元素。

</>复制代码

  1. public static T[] initial(T[] elements) {
  2. return Arrays.copyOfRange(elements, 0, elements.length - 1);
  3. }
initializeArrayWithRange

初始化一个数组,该数组包含在指定范围内的数字,传入 startend

</>复制代码

  1. public static int[] initializeArrayWithRange(int end, int start) {
  2. return IntStream.rangeClosed(start, end).toArray();
  3. }
initializeArrayWithValues

使用指定的值初始化并填充数组。

</>复制代码

  1. public static int[] initializeArrayWithValues(int n, int value) {
  2. return IntStream.generate(() -> value).limit(n).toArray();
  3. }
intersection

返回两个数组中存在的元素列表。

从第二步创建一个集合,然后在 a 上使用 Arrays.stream().filter() 来保存包含在 b 中的值。

</>复制代码

  1. public static int[] intersection(int[] first, int[] second) {
  2. Set set = Arrays.stream(second).boxed().collect(Collectors.toSet());
  3. return Arrays.stream(first)
  4. .filter(set::contains)
  5. .toArray();
  6. }
isSorted

如果数组按升序排序,则返回 1,如果数组按降序排序,返回 -1,如果没有排序,则返回 0

计算前两个元素的排序 direction。使用for循环对数组进行迭代,并对它们进行成对比较。如果 direction 发生变化,则返回 0
如果到达最后一个元素,则返回 direction

</>复制代码

  1. public static > int isSorted(T[] arr) {
  2. final int direction = arr[0].compareTo(arr[1]) < 0 ? 1 : -1;
  3. for (int i = 0; i < arr.length; i++) {
  4. T val = arr[i];
  5. if (i == arr.length - 1) return direction;
  6. else if ((val.compareTo(arr[i + 1]) * direction > 0)) return 0;
  7. }
  8. return direction;
  9. }
join

将数组的所有元素连接到字符串中,并返回此字符串。

使用 IntStream.range 创建一个指定索引的数组。然后,使用 Stream.reduce 将元素组合成字符串。

</>复制代码

  1. public static String join(T[] arr, String separator, String end) {
  2. return IntStream.range(0, arr.length)
  3. .mapToObj(i -> new SimpleEntry<>(i, arr[i]))
  4. .reduce("", (acc, val) -> val.getKey() == arr.length - 2
  5. ? acc + val.getValue() + end
  6. : val.getKey() == arr.length - 1 ? acc + val.getValue() : acc + val.getValue() + separator, (fst, snd) -> fst);
  7. }
nthElement

返回数组的第n个元素。

Use Arrays.copyOfRange() 优先得到包含第n个元素的数组。

</>复制代码

  1. public static T nthElement(T[] arr, int n) {
  2. if (n > 0) {
  3. return Arrays.copyOfRange(arr, n, arr.length)[0];
  4. }
  5. return Arrays.copyOfRange(arr, arr.length + n, arr.length)[0];
  6. }
pick

从对象中选择与给定键对应的键值对。

使用 Arrays.stream 过滤 arr 中存在的所有键。然后,使用 Collectors.toMap 将所有的key转换为Map。

</>复制代码

  1. public static Map pick(Map obj, T[] arr) {
  2. return Arrays.stream(arr)
  3. .filter(obj::containsKey)
  4. .collect(Collectors.toMap(k -> k, obj::get));
  5. }
reducedFilter

根据条件筛选对象数组,同时筛选出未指定的键。

使用 Arrays.stream().filter() 根据谓词 fn 过滤数组,以便返回条件为真的对象。
对于每个过滤的Map对象,创建一个新的Map,其中包含 keys 中的键。最后,将Map对象收集到一个数组中。

</>复制代码

  1. public static Map[] reducedFilter(Map[] data, String[] keys, Predicate> fn) {
  2. return Arrays.stream(data)
  3. .filter(fn)
  4. .map(el -> Arrays.stream(keys).filter(el::containsKey)
  5. .collect(Collectors.toMap(Function.identity(), el::get)))
  6. .toArray((IntFunction[]>) Map[]::new);
  7. }
sample

从数组中返回一个随机元素。

使用 Math.Randoman() 生成一个随机数,然后将它乘以数组的 length,然后使用 Math.floor() 获得一个最近的整数,该方法也适用于字符串。

</>复制代码

  1. public static T sample(T[] arr) {
  2. return arr[(int) Math.floor(Math.random() * arr.length)];
  3. }
sampleSize

arrayarray 大小的唯一键获取 n 个随机元素。

根据Fisher-Yates算法,使用 Array.copyOfRange() 获得优先的 n 个元素。

</>复制代码

  1. public static T[] sampleSize(T[] input, int n) {
  2. T[] arr = Arrays.copyOf(input, input.length);
  3. int length = arr.length;
  4. int m = length;
  5. while (m > 0) {
  6. int i = (int) Math.floor(Math.random() * m--);
  7. T tmp = arr[i];
  8. arr[i] = arr[m];
  9. arr[m] = tmp;
  10. }
  11. return Arrays.copyOfRange(arr, 0, n > length ? length : n);
  12. }
shuffle

将数组值的顺序随机化,返回一个新数组。

根据 Fisher-Yates 算法 重新排序数组的元素。

</>复制代码

  1. public static T[] shuffle(T[] input) {
  2. T[] arr = Arrays.copyOf(input, input.length);
  3. int length = arr.length;
  4. int m = length;
  5. while (m > 0) {
  6. int i = (int) Math.floor(Math.random() * m--);
  7. T tmp = arr[i];
  8. arr[i] = arr[m];
  9. arr[m] = tmp;
  10. }
  11. return arr;
  12. }
similarity

返回出现在两个数组中的元素数组。

使用 Arrays.stream().filter() 移除,然后使用 Arrays.stream().anyMatch() 匹配 second 部分的值。

</>复制代码

  1. public static T[] similarity(T[] first, T[] second) {
  2. return Arrays.stream(first)
  3. .filter(a -> Arrays.stream(second).anyMatch(b -> Objects.equals(a, b)))
  4. // Make a new array of first"s runtime type, but empty content:
  5. .toArray(i -> (T[]) Arrays.copyOf(new Object[0], i, first.getClass()));
  6. }
sortedIndex

返回值应该插入到数组中的最低索引,以保持其排序顺序。

检查数组是否按降序(松散地)排序。 使用 IntStream.range().filter() 来找到元素应该被插入的合适的索引。

</>复制代码

  1. public static > int sortedIndex(T[] arr, T el) {
  2. boolean isDescending = arr[0].compareTo(arr[arr.length - 1]) > 0;
  3. return IntStream.range(0, arr.length)
  4. .filter(i -> isDescending ? el.compareTo(arr[i]) >= 0 : el.compareTo(arr[i]) <= 0)
  5. .findFirst()
  6. .orElse(arr.length);
  7. }
symmetricDifference

返回两个数组之间的对称差异。

从每个数组中创建一个 Set,然后使用 Arrays.stream().filter() 来保持其他值不包含的值。最后,连接两个数组并创建一个新数组并返回。

</>复制代码

  1. public static T[] symmetricDifference(T[] first, T[] second) {
  2. Set sA = new HashSet<>(Arrays.asList(first));
  3. Set sB = new HashSet<>(Arrays.asList(second));
  4. return Stream.concat(
  5. Arrays.stream(first).filter(a -> !sB.contains(a)),
  6. Arrays.stream(second).filter(b -> !sA.contains(b))
  7. ).toArray(i -> (T[]) Arrays.copyOf(new Object[0], i, first.getClass()));
  8. }
tail

返回数组中除第一个元素外的所有元素。

如果数组的长度大于1,则返回 Arrays.copyOfRange(1),否则返回整个数组。

</>复制代码

  1. public static T[] tail(T[] arr) {
  2. return arr.length > 1
  3. ? Arrays.copyOfRange(arr, 1, arr.length)
  4. : arr;
  5. }
take

返回一个从开头删除n个元素的数组。

</>复制代码

  1. public static T[] take(T[] arr, int n) {
  2. return Arrays.copyOfRange(arr, 0, n);
  3. }
takeRight

返回从末尾移除n个元素的数组。

使用 Arrays.copyOfRange() 用从末尾取来的 N 个元素来创建一个数组。

</>复制代码

  1. public static T[] takeRight(T[] arr, int n) {
  2. return Arrays.copyOfRange(arr, arr.length - n, arr.length);
  3. }
union

返回两个数组中任何一个中存在的每个元素一次。

使用 ab 的所有值创建一个 Set,并将其转换为数组。

</>复制代码

  1. public static T[] union(T[] first, T[] second) {
  2. Set set = new HashSet<>(Arrays.asList(first));
  3. set.addAll(Arrays.asList(second));
  4. return set.toArray((T[]) Arrays.copyOf(new Object[0], 0, first.getClass()));
  5. }
without

筛选出具有指定值之一的数组的元素。

使用 Arrays.strean().filter() 创建一个数组,排除(使用 !Arrays.asList(elements).contains())所有命中的值。

</>复制代码

  1. public static T[] without(T[] arr, T... elements) {
  2. List excludeElements = Arrays.asList(elements);
  3. return Arrays.stream(arr)
  4. .filter(el -> !excludeElements.contains(el))
  5. .toArray(i -> (T[]) Arrays.copyOf(new Object[0], i, arr.getClass()));
  6. }
zip

根据原始数组中的位置创建元素数组。

</>复制代码

  1. public static List zip(Object[]... arrays) {
  2. OptionalInt max = Arrays.stream(arrays).mapToInt(arr -> arr.length).max();
  3. return IntStream.range(0, max.getAsInt())
  4. .mapToObj(i -> Arrays.stream(arrays)
  5. .map(arr -> i < arr.length ? arr[i] : null)
  6. .toArray())
  7. .collect(Collectors.toList());
  8. }
zipObject

给定有效的属性标识符数组和值数组,返回将属性与值关联的对象。

</>复制代码

  1. public static Map zipObject(String[] props, Object[] values) {
  2. return IntStream.range(0, props.length)
  3. .mapToObj(i -> new SimpleEntry<>(props[i], i < values.length ? values[i] : null))
  4. .collect(
  5. HashMap::new, (m, v) -> m.put(v.getKey(), v.getValue()), HashMap::putAll);
  6. }
Maths(数学相关) average

返回两个或两个以上数字的平均值。

</>复制代码

  1. public static double average(int[] arr) {
  2. return IntStream.of(arr)
  3. .average()
  4. .orElseThrow(() -> new IllegalArgumentException("Array is empty"));
  5. }
gcd

计算一系列数字的最大公约数(gcd)。

使用 Arrays.stream().reduce() 和 GCD(使用递归公式)计算一组数字的最大公约数。

</>复制代码

  1. public static OptionalInt gcd(int[] numbers) {
  2. return Arrays.stream(numbers)
  3. .reduce((a, b) -> gcd(a, b));
  4. }
  5. private static int gcd(int a, int b) {
  6. if (b == 0) {
  7. return a;
  8. }
  9. return gcd(b, a % b);
  10. }
lcm

计算数字数组的最低公共倍数(LCM)。

使用 Arrays.stream().reduce() 和 LCM公式(使用递归)来计算数字数组的最低公共倍数。

</>复制代码

  1. public static OptionalInt lcm(int[] numbers) {
  2. IntBinaryOperator lcm = (x, y) -> (x * y) / gcd(x, y);
  3. return Arrays.stream(numbers)
  4. .reduce((a, b) -> lcm.applyAsInt(a, b));
  5. }
  6. private static int gcd(int a, int b) {
  7. if (b == 0) {
  8. return a;
  9. }
  10. return gcd(b, a % b);
  11. }
findNextPositivePowerOfTwo

查找大于或等于该值的下一个幂。

该方法使用左移运算符将1与右侧的值位移。右侧使用 Integer.numberOfLeadingZeros方法。
001 << 2 would be 100. 100 in decimal is equal to 4.

Integer.numberOfLeadingZeros 给出了数值前导零的数目。例如,调用 Integer.numberOfLeadingZeros(3) 将赋值为30。
这是因为3在二进制中表示为 11。由于整数有32位,所以有30位有0位。左移运算符的右边变为 32-30 = 2
左移1,即 001 << 2 将是 100,十进制中的 100 等于 4

</>复制代码

  1. public static int findNextPositivePowerOfTwo(int value) {
  2. return 1 << (32 - Integer.numberOfLeadingZeros(value - 1));
  3. }
isEven

检查数字是否是偶数。

这个方法使用按位运算符,0b1 是1的二进制表示。
因为Java 7可以通过用 0b0B 作为前缀来编写二进制文字。
数字为偶数时, 运算符将返回0。 例如,IsEven(4) 会导致 100 & 001 的结果将是 000

</>复制代码

  1. public static boolean isEven(final int value) {
  2. return (value & 0b1) == 0;
  3. }
isPowerOfTwo

检查一个值是2的正幂。

为了理解它是如何工作的,让我们假设我们调用了 IsPowerOfTwo(4)

当值大于0时,将评估 && 运算符的右侧。

(~value + 1) 的结果等于值本身,~100 + 001 => 011 + 001 => 100

(value & value) 的结果是value,100 & 100 => 100.。

当值等于值时,这将把值表达为真值。

</>复制代码

  1. public static boolean isPowerOfTwo(final int value) {
  2. return value > 0 && ((value & (~value + 1)) == value);
  3. }
generateRandomInt

生成一个介于 Integer.MIN_VALUEInteger.MAX_VALUE 之间的随机数。

</>复制代码

  1. public static int generateRandomInt() {
  2. return ThreadLocalRandom.current().nextInt();
  3. }
String(字符串相关) anagrams

生成一个字符串的所有字符(包含重复)。

</>复制代码

  1. public static List anagrams(String input) {
  2. if (input.length() <= 2) {
  3. return input.length() == 2
  4. ? Arrays.asList(input, input.substring(1) + input.substring(0, 1))
  5. : Collections.singletonList(input);
  6. }
  7. return IntStream.range(0, input.length())
  8. .mapToObj(i -> new SimpleEntry<>(i, input.substring(i, i + 1)))
  9. .flatMap(entry ->
  10. anagrams(input.substring(0, entry.getKey()) + input.substring(entry.getKey() + 1))
  11. .stream()
  12. .map(s -> entry.getValue() + s))
  13. .collect(Collectors.toList());
  14. }
byteSize

以字节为单位返回字符串的长度。

</>复制代码

  1. public static int byteSize(String input) {
  2. return input.getBytes().length;
  3. }
capitalize

将字符串首字母大写。

</>复制代码

  1. public static String capitalize(String input, boolean lowerRest) {
  2. return input.substring(0, 1).toUpperCase() +
  3. (lowerRest
  4. ? input.substring(1, input.length()).toLowerCase()
  5. : input.substring(1, input.length()));
  6. }
capitalizeEveryWord

将字符串中每个单词的首字母大写。

</>复制代码

  1. public static String capitalizeEveryWord(final String input) {
  2. return Pattern.compile("(?=w)").splitAsStream(input)
  3. .map(w -> capitalize(w, false))
  4. .collect(Collectors.joining());
  5. }
countVowels

在提供的字符串中返回元音的个数。

</>复制代码

  1. public static int countVowels(String input) {
  2. return input.replaceAll("[^aeiouAEIOU]", "").length();
  3. }
escapeRegExp

转义要在正则表达式中使用的字符串。

</>复制代码

  1. public static String escapeRegExp(String input) {
  2. return Pattern.quote(input);
  3. }
fromCamelCase

从驼峰式转换字符串。

</>复制代码

  1. public static String fromCamelCase(String input, String separator) {
  2. return input
  3. .replaceAll("([a-zd])([A-Z])", "$1" + separator + "$2")
  4. .toLowerCase();
  5. }
isAbsoluteUrl

如果给定的字符串是绝对URL,则返回 true,否则返回 false

</>复制代码

  1. public static boolean isAbsoluteUrl(String url) {
  2. return Pattern.compile("^[a-z][a-z0-9+.-]*:").matcher(url).find();
  3. }
isLowerCase

检查字符串是否为小写。

</>复制代码

  1. public static boolean isLowerCase(String input) {
  2. return Objects.equals(input, input.toLowerCase());
  3. }
isUpperCase

检查字符串是否为大写。

</>复制代码

  1. public static boolean isUpperCase(String input) {
  2. return Objects.equals(input, input.toUpperCase());
  3. }
isPalindrome

判断一个字符串是否回文。

</>复制代码

  1. public static boolean isPalindrome(String input) {
  2. String s = input.toLowerCase().replaceAll("[W_]", "");
  3. return Objects.equals(
  4. s,
  5. new StringBuilder(s).reverse().toString()
  6. );
  7. }
isNumeric

检查字符串是否为数字。

</>复制代码

  1. public static boolean isNumeric(final String input) {
  2. return IntStream.range(0, input.length())
  3. .allMatch(i -> Character.isDigit(input.charAt(i)));
  4. }
mask

用指定的掩码字符替换除最后 num 个字符以外的所有字符。

</>复制代码

  1. public static String mask(String input, int num, String mask) {
  2. int length = input.length();
  3. return num > 0
  4. ?
  5. input.substring(0, length - num).replaceAll(".", mask)
  6. + input.substring(length - num)
  7. :
  8. input.substring(0, Math.negateExact(num))
  9. + input.substring(Math.negateExact(num), length).replaceAll(".", mask);
  10. }
reverseString

反转字符串。

</>复制代码

  1. public static String reverseString(String input) {
  2. return new StringBuilder(input).reverse().toString();
  3. }
sortCharactersInString

按字母顺序排列字符串中的字符。

</>复制代码

  1. public static String sortCharactersInString(String input) {
  2. return Arrays.stream(input.split("")).sorted().collect(Collectors.joining());
  3. }
splitLines

将多行字符串拆分为行数组。

</>复制代码

  1. public static String[] splitLines(String input) {
  2. return input.split("
  3. ?
  4. ");
  5. }
toCamelCase

转换一个字符串为驼峰式。

</>复制代码

  1. public static String toCamelCase(String input) {
  2. Matcher matcher = Pattern.compile("[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+").matcher(input);
  3. List matchedParts = new ArrayList<>();
  4. while (matcher.find()) {
  5. matchedParts.add(matcher.group(0));
  6. }
  7. String s = matchedParts.stream()
  8. .map(x -> x.substring(0, 1).toUpperCase() + x.substring(1).toLowerCase())
  9. .collect(Collectors.joining());
  10. return s.substring(0, 1).toLowerCase() + s.substring(1);
  11. }
toKebabCase

将字符串转换为kebab大小写。

</>复制代码

  1. public static String toKebabCase(String input) {
  2. Matcher matcher = Pattern.compile("[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+").matcher(input);
  3. List matchedParts = new ArrayList<>();
  4. while (matcher.find()) {
  5. matchedParts.add(matcher.group(0));
  6. }
  7. return matchedParts.stream()
  8. .map(String::toLowerCase)
  9. .collect(Collectors.joining("-"));
  10. }
match

正则匹配。

</>复制代码

  1. public static List match(String input, String regex) {
  2. Matcher matcher = Pattern.compile(regex).matcher(input);
  3. List matchedParts = new ArrayList<>();
  4. while (matcher.find()) {
  5. matchedParts.add(matcher.group(0));
  6. }
  7. return matchedParts;
  8. }
toSnakeCase

将字符串转换为蛇形小写,如 Im_Biezhi

</>复制代码

  1. public static String toSnakeCase(String input) {
  2. Matcher matcher = Pattern.compile("[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+").matcher(input);
  3. List matchedParts = new ArrayList<>();
  4. while (matcher.find()) {
  5. matchedParts.add(matcher.group(0));
  6. }
  7. return matchedParts.stream()
  8. .map(String::toLowerCase)
  9. .collect(Collectors.joining("_"));
  10. }
truncateString

将字符串截断到指定的长度。

</>复制代码

  1. public static String truncateString(String input, int num) {
  2. return input.length() > num
  3. ? input.substring(0, num > 3 ? num - 3 : num) + "..."
  4. : input;
  5. }
words

将给定的字符串转换为单词数组。

</>复制代码

  1. public static String[] words(String input) {
  2. return Arrays.stream(input.split("[^a-zA-Z-]+"))
  3. .filter(s -> !s.isEmpty())
  4. .toArray(String[]::new);
  5. }
stringToIntegers

将由空格分隔的数字字符串转换为 int 数组。

</>复制代码

  1. public static int[] stringToIntegers(String numbers) {
  2. return Arrays.stream(numbers.split(" ")).mapToInt(Integer::parseInt).toArray();
  3. }
IO(IO流相关) convertInputStreamToString

将InputStream转换为字符串。

</>复制代码

  1. public static String convertInputStreamToString(final InputStream in) throws IOException {
  2. ByteArrayOutputStream result = new ByteArrayOutputStream();
  3. byte[] buffer = new byte[1024];
  4. int length;
  5. while ((length = in.read(buffer)) != -1) {
  6. result.write(buffer, 0, length);
  7. }
  8. return result.toString(StandardCharsets.UTF_8.name());
  9. }
readFileAsString

将文件内容读入字符串。

</>复制代码

  1. public String readFileAsString(Path path) throws IOException {
  2. return new String(Files.readAllBytes(path));
  3. }
getCurrentWorkingDirectoryPath

获取当前工作目录。

</>复制代码

  1. public static String getCurrentWorkingDirectoryPath() {
  2. return FileSystems.getDefault().getPath("").toAbsolutePath().toString();
  3. }
tmpDirName

返回 java.io.tmpdir 系统属性的值。如果末尾没有分隔符,则追加分隔符。

</>复制代码

  1. public static String tmpDirName() {
  2. String tmpDirName = System.getProperty("java.io.tmpdir");
  3. if (!tmpDirName.endsWith(File.separator)) {
  4. tmpDirName += File.separator;
  5. }
  6. return tmpDirName;
  7. }
Exception(异常相关) stackTraceAsString

将异常堆栈跟踪转换为字符串。

</>复制代码

  1. public static String stackTraceAsString(final Throwable throwable) {
  2. final StringWriter sw = new StringWriter();
  3. throwable.printStackTrace(new PrintWriter(sw));
  4. return sw.toString();
  5. }
System osName

以小写字符串的形式获取操作系统的名称。

</>复制代码

  1. public static String osName() {
  2. return System.getProperty("os.name").toLowerCase();
  3. }
isDebuggerEnabled

检查JVM是否为debug模式。

</>复制代码

  1. public static boolean isDebuggerAttached() {
  2. final RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
  3. return runtimeMXBean.getInputArguments()
  4. .stream()
  5. .anyMatch(arg -> arg.contains("-agentlib:jdwp"));
  6. }
Class(类相关) getAllInterfaces

此方法返回由给定类及其超类实现的所有接口。

该方法通过连接两个Stream来工作。第一个Stream是通过创建带有接口的流和接口实现的所有接口来递归构建的。
第二个Stream对超类也是如此。其结果是删除重复项后将两个Stream连接起来。

</>复制代码

  1. public static List> getAllInterfaces(Class cls) {
  2. return Stream.concat(
  3. Arrays.stream(cls.getInterfaces()).flatMap(intf ->
  4. Stream.concat(Stream.of(intf), getAllInterfaces(intf).stream())),
  5. cls.getSuperclass() == null ? Stream.empty() : getAllInterfaces(cls.getSuperclass()).stream()
  6. ).distinct().collect(Collectors.toList());
  7. }
isInnerClass

此方法检查指定的类是内部类还是静态嵌套类。

</>复制代码

  1. public static boolean isInnerClass(final Class cls) {
  2. return cls != null && cls.getEnclosingClass() != null;
  3. }
Enum(枚举相关) getEnumMap

将枚举转换为 Map,其中 key 是枚举名,value 是枚举本身。

</>复制代码

  1. public static > Map getEnumMap(final Class enumClass) {
  2. return Arrays.stream(enumClass.getEnumConstants())
  3. .collect(Collectors.toMap(Enum::name, Function.identity()));
  4. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74344.html

相关文章

  • 2019 年值得关注 23 个开发者博客

    摘要:如果你正在寻找编程技巧,或是想了解编程界发生了哪些新鲜事那么,今天我们带来的年最佳开发者博客列表,一定是你的菜。地址它是为数不多的印度开发者博客中,能够提供有价值信息的博客。地址又一个专注前端开发的博客。 如果你正在寻找编程技巧,或是想了解编程界发生了哪些新鲜事?那么,今天我们带来的 2019 年最佳开发者博客列表,一定是你的菜。这些博客将会帮助你发现新的工具,并带给你编程技巧的启发。...

    pepperwang 评论0 收藏0
  • 2019 年值得关注 23 个开发者博客

    摘要:如果你正在寻找编程技巧,或是想了解编程界发生了哪些新鲜事那么,今天我们带来的年最佳开发者博客列表,一定是你的菜。地址它是为数不多的印度开发者博客中,能够提供有价值信息的博客。地址又一个专注前端开发的博客。 如果你正在寻找编程技巧,或是想了解编程界发生了哪些新鲜事?那么,今天我们带来的 2019 年最佳开发者博客列表,一定是你的菜。这些博客将会帮助你发现新的工具,并带给你编程技巧的启发。...

    DTeam 评论0 收藏0
  • 2019 年值得关注 23 个开发者博客

    摘要:如果你正在寻找编程技巧,或是想了解编程界发生了哪些新鲜事那么,今天我们带来的年最佳开发者博客列表,一定是你的菜。地址它是为数不多的印度开发者博客中,能够提供有价值信息的博客。地址又一个专注前端开发的博客。 如果你正在寻找编程技巧,或是想了解编程界发生了哪些新鲜事?那么,今天我们带来的 2019 年最佳开发者博客列表,一定是你的菜。这些博客将会帮助你发现新的工具,并带给你编程技巧的启发。...

    赵连江 评论0 收藏0
  • 【收藏】8段JQuery处理表单代码片段,很实用

    1 只接受数字输入 $(#uAge).keydown(function(event) { // 允许退格和删除键 if ( event.keyCode == 46 || event.keyCode == 8 ) { } else { // 保证输入的是数字键 if (event.keyCode < 48 || event.keyCod...

    zxhaaa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<