# 30-seconds-of-java8
**Repository Path**: ljs2016/30-seconds-of-java8
## Basic Information
- **Project Name**: 30-seconds-of-java8
- **Description**: 30 seconds to collect useful Java8 snippet
- **Primary Language**: Java
- **License**: CC0-1.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2023-07-10
- **Last Updated**: 2023-07-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 30 seconds of java8
[](https://github.com/biezhi/30-seconds-of-java8/blob/master/LICENSE)
[](http://makeapullrequest.com)
[](https://travis-ci.org/biezhi/30-seconds-of-java8)
[](https://www.zhihu.com/people/biezhi)
[](https://github.com/biezhi)
> 你可以在30秒或更短时间内收集有用的Java8代码片段。
- 使用 Ctrl + F 或者 command + F 来查找代码片段。
- 代码片段基于 Java8,如果你还不熟悉可以在[这里](https://zhuanlan.zhihu.com/java8)学习。
- 代码片段翻译自 [little-java-functions](https://github.com/shekhargulati/little-java-functions)
## 目录
### 📚 Array (数组相关)
详细信息
* [`chunk`](#chunk)
* [`countOccurrences`](#countoccurrences)
* [`deepFlatten`](#deepflatten)
* [`difference`](#difference)
* [`differenceWith`](#differencewith)
* [`distinctValuesOfArray`](#distinctvaluesofarray)
* [`dropElements`](#dropelements)
* [`dropRight`](#dropright)
* [`everyNth`](#everynth)
* [`filterNonUnique`](#filternonunique)
* [`flatten`](#flatten)
* [`flattenDepth`](#flattendepth)
* [`groupBy`](#groupby)
* [`head`](#head)
* [`initial`](#initial)
* [`initializeArrayWithRange`](#initializearraywithrange)
* [`initializeArrayWithValues`](#initializearraywithvalues)
* [`intersection`](#intersection)
* [`isSorted`](#issorted)
* [`join`](#join)
* [`nthElement`](#nthelement)
* [`pick`](#pick)
* [`reducedFilter`](#reducedfilter)
* [`remove`](#remove)
* [`sample`](#sample)
* [`sampleSize`](#samplesize)
* [`shuffle`](#shuffle)
* [`similarity`](#similarity)
* [`sortedIndex`](#sortedindex)
* [`symmetricDifference`](#symmetricdifference)
* [`tail`](#tail)
* [`take`](#take)
* [`takeRight`](#takeright)
* [`union`](#union)
* [`without`](#without)
* [`zip`](#zip)
* [`zipObject`](#zipobject)
### ➗ Math (数学相关)
详细信息
* [`average`](#average)
* [`gcd`](#gcd)
* [`lcm`](#lcm)
* [`findNextPositivePowerOfTwo`](#findnextpositivepoweroftwo)
* [`isEven`](#iseven)
* [`isPowerOfTwo`](#ispoweroftwo)
* [`generateRandomInt`](#generaterandomint)
### 📜 String (字符串相关)
详细信息
* [`anagrams`](#anagrams)
* [`byteSize`](#bytesize)
* [`capitalize`](#capitalize)
* [`capitalizeEveryWord`](#capitalizeeveryword)
* [`countVowels`](#countvowels)
* [`escapeRegExp`](#escaperegexp)
* [`fromCamelCase`](#fromcamelcase)
* [`isAbsoluteURL`](#isabsoluteurl)
* [`isLowerCase`](#islowercase)
* [`isUpperCase`](#isuppercase)
* [`isPalindrome`](#ispalindrome)
* [`isNumeric`](#isnumeric)
* [`mask`](#mask)
* [`reverseString`](#reversestring)
* [`sortCharactersInString`](#sortcharactersinstring)
* [`splitLines`](#splitlines)
* [`toCamelCase`](#tocamelcase)
* [`toKebabCase`](#tokebabcase)
* [`match`](#match)
* [`toSnakeCase`](#tosnakecase)
* [`truncateString`](#truncatestring)
* [`words`](#words)
* [`stringToIntegers`](#stringtointegers)
### ⭕️ IO (IO流相关)
详细信息
* [`convertInputStreamToString`](#convertinputstreamtostring)
* [`readFileAsString`](#readfileasstring)
* [`getCurrentWorkingDirectoryPath`](#getcurrentworkingdirectorypath)
* [`tmpDirName`](#tmpdirname)
### ❌ Exception (异常相关)
详细信息
* [`stackTraceAsString`](#stacktraceasstring)
### 🖥 System (系统相关)
详细信息
- [`osName`](#osname)
- [`isDebuggerEnabled`](#isdebuggerenabled)
### 💡 Class (类相关)
详细信息
- [`getAllInterfaces`](#getallinterfaces)
- [`IsInnerClass`](#isinnerclass)
### 💎 Enum (枚举相关)
详细信息
- [`getEnumMap`](#getenummap)
## Array
### chunk
将数组分割成特定大小的小数组。
```java
public static int[][] chunk(int[] numbers, int size) {
return IntStream.iterate(0, i -> i + size)
.limit((long) Math.ceil((double) numbers.length / size))
.mapToObj(cur -> Arrays.copyOfRange(numbers, cur, cur + size > numbers.length ? numbers.length : cur + size))
.toArray(int[][]::new);
}
```
[⬆ 回到顶部](#目录)
### concat
```java
public static T[] concat(T[] first, T[] second) {
return Stream.concat(
Stream.of(first),
Stream.of(second)
).toArray(i -> (T[]) Arrays.copyOf(new Object[0], i, first.getClass()));
}
```
[⬆ 回到顶部](#目录)
### countOccurrences
计算数组中某个值出现的次数。
使用 `Arrays.stream().filter().count()` 计算等于指定值的值的总数。
```java
public static long countOccurrences(int[] numbers, int value) {
return Arrays.stream(numbers)
.filter(number -> number == value)
.count();
}
```
[⬆ 回到顶部](#目录)
### deepFlatten
数组扁平化。
使用递归实现,`Arrays.stream().flatMapToInt()`
```java
public static int[] deepFlatten(Object[] input) {
return Arrays.stream(input)
.flatMapToInt(o -> {
if (o instanceof Object[]) {
return Arrays.stream(deepFlatten((Object[]) o));
}
return IntStream.of((Integer) o);
}).toArray();
}
```
[⬆ 回到顶部](#目录)
### difference
返回两个数组之间的差异。
从 b 中创建一个集合,然后在 a 上使用 `Arrays.stream().filter()` 只保留 b 中不包含的值。
```java
public static int[] difference(int[] first, int[] second) {
Set set = Arrays.stream(second).boxed().collect(Collectors.toSet());
return Arrays.stream(first)
.filter(v -> !set.contains(v))
.toArray();
}
```
[⬆ 回到顶部](#目录)
### differenceWith
从比较器函数不返回true的数组中筛选出所有值。
int的比较器是使用IntbinaryPerator函数来实现的。
使用 `Arrays.stream().filter()` 和 `Arrays.stream().noneMatch()` 查找相应的值。
```java
public static int[] differenceWith(int[] first, int[] second, IntBinaryOperator comparator) {
return Arrays.stream(first)
.filter(a ->
Arrays.stream(second)
.noneMatch(b -> comparator.applyAsInt(a, b) == 0)
).toArray();
}
```
[⬆ 回到顶部](#目录)
### distinctValuesOfArray
返回数组的所有不同值。
使用 `Arrays.stream().distinct()` 去除所有重复的值。
```java
public static int[] distinctValuesOfArray(int[] elements) {
return Arrays.stream(elements).distinct().toArray();
}
```
[⬆ 回到顶部](#目录)
### dropElements
移除数组中的元素,直到传递的函数返回true为止。返回数组中的其余元素。
使用数组循环遍历数组,将数组的第一个元素删除,直到函数返回的值为真为止。返回其余的元素。
```java
public static int[] dropElements(int[] elements, IntPredicate condition) {
while (elements.length > 0 && !condition.test(elements[0])) {
elements = Arrays.copyOfRange(elements, 1, elements.length);
}
return elements;
}
```
[⬆ 回到顶部](#目录)
### dropRight
返回一个新数组,从右边移除n个元素。
检查n是否短于给定的数组,并使用 `Array.copyOfRange()` 以便对其进行相应的切片或返回一个空数组。
```java
public static int[] dropRight(int[] elements, int n) {
if (n < 0) {
throw new IllegalArgumentException("n is less than 0");
}
return n < elements.length
? Arrays.copyOfRange(elements, 0, elements.length - n)
: new int[0];
}
```
[⬆ 回到顶部](#目录)
### everyNth
返回数组中的每个第n个元素。
使用 `IntStream.range().filter()` 创建一个新数组,该数组包含给定数组的每个第n个元素。
```java
public static int[] everyNth(int[] elements, int nth) {
return IntStream.range(0, elements.length)
.filter(i -> i % nth == nth - 1)
.map(i -> elements[i])
.toArray();
}
```
[⬆ 回到顶部](#目录)
### indexOf
查找数组中元素的索引,在不存在元素的情况下返回-1。
使用 `IntStream.range().filter()` 查找数组中元素的索引。
```java
public static int indexOf(int[] elements, int el) {
return IntStream.range(0, elements.length)
.filter(idx -> elements[idx] == el)
.findFirst()
.orElse(-1);
}
```
[⬆ 回到顶部](#目录)
### lastIndexOf
查找数组中元素的最后索引,在不存在元素的情况下返回-1。
使用 `IntStream.iterate().limit().filter()` 查找数组中元素的索引。
```java
public static int lastIndexOf(int[] elements, int el) {
return IntStream.iterate(elements.length - 1, i -> i - 1)
.limit(elements.length)
.filter(idx -> elements[idx] == el)
.findFirst()
.orElse(-1);
}
```
[⬆ 回到顶部](#目录)
### filterNonUnique
筛选出数组中的非唯一值。
对只包含唯一值的数组使用 `Arrays.stream().filter()`。
```java
public static int[] filterNonUnique(int[] elements) {
return Arrays.stream(elements)
.filter(el -> indexOf(elements, el) == lastIndexOf(elements, el))
.toArray();
}
```
[⬆ 回到顶部](#目录)
### flatten
使数组扁平。
使用 `Arrays.stream().flatMapToInt().toArray()` 创建一个新数组。
```java
public static int[] flatten(Object[] elements) {
return Arrays.stream(elements)
.flatMapToInt(el -> el instanceof int[]
? Arrays.stream((int[]) el)
: IntStream.of((int) el)
).toArray();
}
```
[⬆ 回到顶部](#目录)
### flattenDepth
将数组压平到指定的深度。
```java
public static Object[] flattenDepth(Object[] elements, int depth) {
if (depth == 0) {
return elements;
}
return Arrays.stream(elements)
.flatMap(el -> el instanceof Object[]
? Arrays.stream(flattenDepth((Object[]) el, depth - 1))
: Arrays.stream(new Object[]{el})
).toArray();
}
```
[⬆ 回到顶部](#目录)
### groupBy
根据给定函数对数组元素进行分组。
使用 `Arrays.stream().collect(Collectors.groupingBy())` 分组。
```java
public static Map> groupBy(T[] elements, Function func) {
return Arrays.stream(elements).collect(Collectors.groupingBy(func));
}
```
[⬆ 回到顶部](#目录)
### initial
返回数组中除去最后一个的所有元素。
使用 `Arrays.copyOfRange()` 返回除最后一个之外的所有元素。
```java
public static T[] initial(T[] elements) {
return Arrays.copyOfRange(elements, 0, elements.length - 1);
}
```
[⬆ 回到顶部](#目录)
### initializeArrayWithRange
初始化一个数组,该数组包含在指定范围内的数字,传入 `start` 和 `end`。
```java
public static int[] initializeArrayWithRange(int end, int start) {
return IntStream.rangeClosed(start, end).toArray();
}
```
[⬆ 回到顶部](#目录)
### initializeArrayWithValues
使用指定的值初始化并填充数组。
```java
public static int[] initializeArrayWithValues(int n, int value) {
return IntStream.generate(() -> value).limit(n).toArray();
}
```
[⬆ 回到顶部](#目录)
### intersection
返回两个数组中存在的元素列表。
从第二步创建一个集合,然后在 a 上使用 `Arrays.stream().filter()` 来保存包含在 b 中的值。
```java
public static int[] intersection(int[] first, int[] second) {
Set set = Arrays.stream(second).boxed().collect(Collectors.toSet());
return Arrays.stream(first)
.filter(set::contains)
.toArray();
}
```
[⬆ 回到顶部](#目录)
### isSorted
如果数组按升序排序,则返回 `1`,如果数组按降序排序,返回 `-1`,如果没有排序,则返回 `0`。
计算前两个元素的排序 `direction`。使用for循环对数组进行迭代,并对它们进行成对比较。如果 `direction` 发生变化,则返回 `0`,
如果到达最后一个元素,则返回 `direction`。
```java
public static > int isSorted(T[] arr) {
final int direction = arr[0].compareTo(arr[1]) < 0 ? 1 : -1;
for (int i = 0; i < arr.length; i++) {
T val = arr[i];
if (i == arr.length - 1) return direction;
else if ((val.compareTo(arr[i + 1]) * direction > 0)) return 0;
}
return direction;
}
```
[⬆ 回到顶部](#目录)
### join
将数组的所有元素连接到字符串中,并返回此字符串。
使用 `IntStream.range` 创建一个指定索引的数组。然后,使用 `Stream.reduce` 将元素组合成字符串。
```java
public static String join(T[] arr, String separator, String end) {
return IntStream.range(0, arr.length)
.mapToObj(i -> new SimpleEntry<>(i, arr[i]))
.reduce("", (acc, val) -> val.getKey() == arr.length - 2
? acc + val.getValue() + end
: val.getKey() == arr.length - 1 ? acc + val.getValue() : acc + val.getValue() + separator, (fst, snd) -> fst);
}
```
[⬆ 回到顶部](#目录)
### nthElement
返回数组的第n个元素。
Use `Arrays.copyOfRange()` 优先得到包含第n个元素的数组。
```Java
public static T nthElement(T[] arr, int n) {
if (n > 0) {
return Arrays.copyOfRange(arr, n, arr.length)[0];
}
return Arrays.copyOfRange(arr, arr.length + n, arr.length)[0];
}
```
[⬆ 回到顶部](#目录)
### pick
从对象中选择与给定键对应的键值对。
使用 `Arrays.stream` 过滤 `arr` 中存在的所有键。然后,使用 `Collectors.toMap` 将所有的key转换为Map。
```java
public static Map pick(Map obj, T[] arr) {
return Arrays.stream(arr)
.filter(obj::containsKey)
.collect(Collectors.toMap(k -> k, obj::get));
}
```
[⬆ 回到顶部](#目录)
### reducedFilter
根据条件筛选对象数组,同时筛选出未指定的键。
使用 `Arrays.stream().filter()` 根据谓词 `fn` 过滤数组,以便返回条件为真的对象。
对于每个过滤的Map对象,创建一个新的Map,其中包含 `keys` 中的键。最后,将Map对象收集到一个数组中。
```java
public static Map[] reducedFilter(Map[] data, String[] keys, Predicate