generated from mingliqiye/lib-tem
refactor(mingli-utils):重构并添加多个实用工具类- 重构 AutoConfiguration 类,优化启动时打印逻辑
All checks were successful
Gitea Actions Build / Build (push) Successful in 53s
All checks were successful
Gitea Actions Build / Build (push) Successful in 53s
- 新增 OsPath 类,提供跨平台路径操作支持 - 新增 VersionUtils 类,实现版本号比较功能- 新增 P1R1Function 接口,简化函数式编程 - 优化 Base64Utils、Lists、NetWorkUtil、StringUtil 和 SystemUtil 类 - 更新项目版本号至 2.0.4
This commit is contained in:
parent
0d15cbbcc0
commit
49c3b76250
@ -1,4 +1,4 @@
|
|||||||
JDKVERSIONS=1.8
|
JDKVERSIONS=1.8
|
||||||
GROUPSID=com.mingliqiye.utils
|
GROUPSID=com.mingliqiye.utils
|
||||||
ARTIFACTID=mingli-utils
|
ARTIFACTID=mingli-utils
|
||||||
VERSIONS=2.0.0
|
VERSIONS=2.0.4
|
||||||
|
@ -169,4 +169,8 @@ public class Base64Utils {
|
|||||||
System.arraycopy(bytes, offset, data, 0, length);
|
System.arraycopy(bytes, offset, data, 0, length);
|
||||||
return encode(data);
|
return encode(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String encodeBytes(byte[] bytes) {
|
||||||
|
return encodeBytes(bytes, 0, bytes.length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
23
src/com/mingliqiye/utils/callback/P1R1Function.java
Normal file
23
src/com/mingliqiye/utils/callback/P1R1Function.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package com.mingliqiye.utils.callback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PRFunction接口表示一个接收参数P并返回结果R的函数式接口
|
||||||
|
* <p>
|
||||||
|
* 该接口使用@,表明它是一个函数式接口,
|
||||||
|
* 只包含一个抽象方法FunctionalInterface注解标记call,可用于Lambda表达式和方法引用
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author MingLiPro
|
||||||
|
* @param <P> 函数接收的参数类型
|
||||||
|
* @param <R> 函数返回的结果类型
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface P1R1Function<P, R> {
|
||||||
|
/**
|
||||||
|
* 执行函数调用
|
||||||
|
*
|
||||||
|
* @param p 输入参数
|
||||||
|
* @return 函数执行结果
|
||||||
|
*/
|
||||||
|
R call(P p);
|
||||||
|
}
|
@ -1,9 +1,10 @@
|
|||||||
package com.mingliqiye.utils.collection;
|
package com.mingliqiye.utils.collection;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists工具类提供了一系列创建List实现的便捷方法。
|
* Lists工具类提供了一系列创建List实现的便捷方法。
|
||||||
*
|
*
|
||||||
@ -247,6 +248,13 @@ public class Lists {
|
|||||||
return newList.toArray(new String[0]);
|
return newList.toArray(new String[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将列表转换为数组
|
||||||
|
*
|
||||||
|
* @param ts 要转换的列表
|
||||||
|
* @param <T> 数组元素的类型
|
||||||
|
* @return 包含列表中所有元素的数组,如果列表为null则返回null
|
||||||
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public static <T> T[] toArray(List<T> ts) {
|
public static <T> T[] toArray(List<T> ts) {
|
||||||
if (ts == null) {
|
if (ts == null) {
|
||||||
@ -258,4 +266,161 @@ public class Lists {
|
|||||||
});
|
});
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将数组转换为列表
|
||||||
|
*
|
||||||
|
* @param ts 要转换的数组
|
||||||
|
* @param <T> 列表元素的类型
|
||||||
|
* @return 包含数组中所有元素的列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
// 原始的方法 - 用于引用类型
|
||||||
|
@Nullable
|
||||||
|
public static <T> List<T> toList(T[] ts) {
|
||||||
|
return ts == null ? null : new ArrayList<>(Arrays.asList(ts));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将int数组转换为Integer列表
|
||||||
|
*
|
||||||
|
* @param array 要转换的int数组
|
||||||
|
* @return 包含数组中所有元素的Integer列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static List<Integer> toList(int[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Integer> list = new ArrayList<>(array.length);
|
||||||
|
for (int value : array) {
|
||||||
|
list.add(value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将long数组转换为Long列表
|
||||||
|
*
|
||||||
|
* @param array 要转换的long数组
|
||||||
|
* @return 包含数组中所有元素的Long列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static List<Long> toList(long[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Long> list = new ArrayList<>(array.length);
|
||||||
|
for (long value : array) {
|
||||||
|
list.add(value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将double数组转换为Double列表
|
||||||
|
*
|
||||||
|
* @param array 要转换的double数组
|
||||||
|
* @return 包含数组中所有元素的Double列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static List<Double> toList(double[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Double> list = new ArrayList<>(array.length);
|
||||||
|
for (double value : array) {
|
||||||
|
list.add(value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将float数组转换为Float列表
|
||||||
|
*
|
||||||
|
* @param array 要转换的float数组
|
||||||
|
* @return 包含数组中所有元素的Float列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static List<Float> toList(float[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Float> list = new ArrayList<>(array.length);
|
||||||
|
for (float value : array) {
|
||||||
|
list.add(value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将boolean数组转换为Boolean列表
|
||||||
|
*
|
||||||
|
* @param array 要转换的boolean数组
|
||||||
|
* @return 包含数组中所有元素的Boolean列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static List<Boolean> toList(boolean[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Boolean> list = new ArrayList<>(array.length);
|
||||||
|
for (boolean value : array) {
|
||||||
|
list.add(value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将char数组转换为Character列表
|
||||||
|
*
|
||||||
|
* @param array 要转换的char数组
|
||||||
|
* @return 包含数组中所有元素的Character列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static List<Character> toList(char[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Character> list = new ArrayList<>(array.length);
|
||||||
|
for (char value : array) {
|
||||||
|
list.add(value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将byte数组转换为Byte列表
|
||||||
|
*
|
||||||
|
* @param array 要转换的byte数组
|
||||||
|
* @return 包含数组中所有元素的Byte列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static List<Byte> toList(byte[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Byte> list = new ArrayList<>(array.length);
|
||||||
|
for (byte value : array) {
|
||||||
|
list.add(value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将short数组转换为Short列表
|
||||||
|
*
|
||||||
|
* @param array 要转换的short数组
|
||||||
|
* @return 包含数组中所有元素的Short列表,如果数组为null则返回null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static List<Short> toList(short[] array) {
|
||||||
|
if (array == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Short> list = new ArrayList<>(array.length);
|
||||||
|
for (short value : array) {
|
||||||
|
list.add(value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -4,6 +4,9 @@ import com.sun.jna.Library;
|
|||||||
import com.sun.jna.Native;
|
import com.sun.jna.Native;
|
||||||
import com.sun.jna.ptr.LongByReference;
|
import com.sun.jna.ptr.LongByReference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author MingLiPro
|
||||||
|
*/
|
||||||
public interface WinKernel32 extends Library {
|
public interface WinKernel32 extends Library {
|
||||||
static WinKernel32 load() {
|
static WinKernel32 load() {
|
||||||
return Native.load("kernel32", WinKernel32.class);
|
return Native.load("kernel32", WinKernel32.class);
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
package com.mingliqiye.utils.network;
|
|
||||||
|
|
||||||
public class NetWorkUtil {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
System.out.println(NetworkEndpoint.of("127.0.0.1", 25565));
|
|
||||||
System.out.println(NetworkEndpoint.of("127.0.0.1:25565"));
|
|
||||||
System.out.println(NetworkEndpoint.of("127.0.0.1:25565"));
|
|
||||||
}
|
|
||||||
}
|
|
194
src/com/mingliqiye/utils/path/OsPath.java
Normal file
194
src/com/mingliqiye/utils/path/OsPath.java
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
package com.mingliqiye.utils.path;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.nio.file.*;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Spliterator;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class OsPath implements Path {
|
||||||
|
|
||||||
|
private final Path path;
|
||||||
|
|
||||||
|
private OsPath(Path path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OsPath of(String path) {
|
||||||
|
return of(Paths.get(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OsPath of(Path path) {
|
||||||
|
return new OsPath(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull FileSystem getFileSystem() {
|
||||||
|
return path.getFileSystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAbsolute() {
|
||||||
|
return path.isAbsolute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Path getRoot() {
|
||||||
|
return path.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Path getFileName() {
|
||||||
|
return path.getFileName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Path getParent() {
|
||||||
|
Path a = path.getParent();
|
||||||
|
if (a == null) {
|
||||||
|
a = path.toAbsolutePath().getParent();
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNameCount() {
|
||||||
|
return path.getNameCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path getName(int index) {
|
||||||
|
return path.getName(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path subpath(int beginIndex, int endIndex) {
|
||||||
|
return path.subpath(beginIndex, endIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean startsWith(@NotNull Path other) {
|
||||||
|
return path.startsWith(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean startsWith(@NotNull String other) {
|
||||||
|
return path.startsWith(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean endsWith(@NotNull Path other) {
|
||||||
|
return path.endsWith(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean endsWith(@NotNull String other) {
|
||||||
|
return path.endsWith(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path normalize() {
|
||||||
|
return path.normalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path resolve(@NotNull Path other) {
|
||||||
|
return path.resolve(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path resolve(@NotNull String other) {
|
||||||
|
return path.resolve(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path resolveSibling(@NotNull Path other) {
|
||||||
|
return path.resolveSibling(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path resolveSibling(@NotNull String other) {
|
||||||
|
return path.resolveSibling(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path relativize(@NotNull Path other) {
|
||||||
|
return path.relativize(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull URI toUri() {
|
||||||
|
return path.toUri();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path toAbsolutePath() {
|
||||||
|
return path.toAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Path toRealPath(@NotNull LinkOption... options)
|
||||||
|
throws IOException {
|
||||||
|
return path.toRealPath(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull File toFile() {
|
||||||
|
return path.toFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull WatchKey register(
|
||||||
|
@NotNull WatchService watcher,
|
||||||
|
WatchEvent.@NotNull Kind<?>[] events,
|
||||||
|
@NotNull WatchEvent.Modifier... modifiers
|
||||||
|
) throws IOException {
|
||||||
|
return path.register(watcher, events, modifiers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull WatchKey register(
|
||||||
|
@NotNull WatchService watcher,
|
||||||
|
WatchEvent.@NotNull Kind<?>... events
|
||||||
|
) throws IOException {
|
||||||
|
return path.register(watcher, events);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Iterator<@NotNull Path> iterator() {
|
||||||
|
return path.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(@NotNull Path other) {
|
||||||
|
return path.compareTo(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
return path.equals(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return path.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String toString() {
|
||||||
|
return path.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void forEach(Consumer<? super Path> action) {
|
||||||
|
path.forEach(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Spliterator<Path> spliterator() {
|
||||||
|
return path.spliterator();
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
|
|||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
@ -23,7 +22,7 @@ import java.io.InputStream;
|
|||||||
@ComponentScan({ SpringBeanUtil.PACKAGE_NAME })
|
@ComponentScan({ SpringBeanUtil.PACKAGE_NAME })
|
||||||
public class AutoConfiguration {
|
public class AutoConfiguration {
|
||||||
|
|
||||||
private static String banner =
|
private static final String banner =
|
||||||
"---------------------------------------------------------\n" +
|
"---------------------------------------------------------\n" +
|
||||||
"| $$\\ $$\\ $$\\ $$\\ $$\\ $$$$$$$$\\ $$$$$$\\ |\n" +
|
"| $$\\ $$\\ $$\\ $$\\ $$\\ $$$$$$$$\\ $$$$$$\\ |\n" +
|
||||||
"| $$$\\ $$$ |$$ | $$ | $$ |\\__$$ __|$$ __$$\\ |\n" +
|
"| $$$\\ $$$ |$$ | $$ | $$ |\\__$$ __|$$ __$$\\ |\n" +
|
||||||
@ -33,6 +32,7 @@ public class AutoConfiguration {
|
|||||||
"| $$ |\\$ /$$ |$$ | $$ | $$ | $$ | $$\\ $$ | |\n" +
|
"| $$ |\\$ /$$ |$$ | $$ | $$ | $$ | $$\\ $$ | |\n" +
|
||||||
"| $$ | \\_/ $$ |$$$$$$$$\\\\$$$$$$ | $$ | \\$$$$$$ | |\n" +
|
"| $$ | \\_/ $$ |$$$$$$$$\\\\$$$$$$ | $$ | \\$$$$$$ | |\n" +
|
||||||
"| \\__| \\__|\\________|\\______/ \\__| \\______/ |\n";
|
"| \\__| \\__|\\________|\\______/ \\__| \\______/ |\n";
|
||||||
|
private static String banner2;
|
||||||
private boolean isloadObjMapper;
|
private boolean isloadObjMapper;
|
||||||
|
|
||||||
public AutoConfiguration() throws IOException {
|
public AutoConfiguration() throws IOException {
|
||||||
@ -48,9 +48,9 @@ public class AutoConfiguration {
|
|||||||
"Jackson ObjectMapper not found in classpath. Jackson serialization features will be disabled."
|
"Jackson ObjectMapper not found in classpath. Jackson serialization features will be disabled."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostConstruct
|
|
||||||
public void init() {
|
public void init() {
|
||||||
if (isloadObjMapper) {
|
if (isloadObjMapper) {
|
||||||
log.info("init ObjectMapper");
|
log.info("init ObjectMapper");
|
||||||
@ -66,6 +66,7 @@ public class AutoConfiguration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void print() throws IOException {
|
public void print() throws IOException {
|
||||||
|
banner2 = banner;
|
||||||
InputStream inputStream = AutoConfiguration.class.getResourceAsStream(
|
InputStream inputStream = AutoConfiguration.class.getResourceAsStream(
|
||||||
"/META-INF/meta-data"
|
"/META-INF/meta-data"
|
||||||
);
|
);
|
||||||
@ -87,14 +88,14 @@ public class AutoConfiguration {
|
|||||||
for (int ia = 0; ia < spacesNeeded; ia++) {
|
for (int ia = 0; ia < spacesNeeded; ia++) {
|
||||||
da.append(" ");
|
da.append(" ");
|
||||||
}
|
}
|
||||||
banner += da + "|\n";
|
banner2 += da + "|\n";
|
||||||
} else {
|
} else {
|
||||||
banner += content.substring(0, targetLength) + "|\n";
|
banner2 += content.substring(0, targetLength) + "|\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
System.out.printf(
|
System.out.printf(
|
||||||
banner,
|
banner2,
|
||||||
DateTime.now().format(Formatter.STANDARD_DATETIME_MILLISECOUND7)
|
DateTime.now().format(Formatter.STANDARD_DATETIME_MILLISECOUND7)
|
||||||
);
|
);
|
||||||
System.out.println(
|
System.out.println(
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.mingliqiye.utils.string;
|
package com.mingliqiye.utils.string;
|
||||||
|
|
||||||
|
import com.mingliqiye.utils.callback.P1R1Function;
|
||||||
import com.mingliqiye.utils.collection.Lists;
|
import com.mingliqiye.utils.collection.Lists;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -136,7 +137,7 @@ public class StringUtil {
|
|||||||
public static <P> String join(
|
public static <P> String join(
|
||||||
String separator,
|
String separator,
|
||||||
List<P> list,
|
List<P> list,
|
||||||
PRFunction<P, String> fun
|
P1R1Function<P, String> fun
|
||||||
) {
|
) {
|
||||||
// 处理空列表情况
|
// 处理空列表情况
|
||||||
if (list == null || list.isEmpty()) {
|
if (list == null || list.isEmpty()) {
|
||||||
@ -189,25 +190,4 @@ public class StringUtil {
|
|||||||
public static StringBuilder stringBuilder(int i) {
|
public static StringBuilder stringBuilder(int i) {
|
||||||
return new StringBuilder(i);
|
return new StringBuilder(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* PRFunction接口表示一个接收参数P并返回结果R的函数式接口
|
|
||||||
* <p>
|
|
||||||
* 该接口使用@FunctionalInterface注解标记,表明它是一个函数式接口,
|
|
||||||
* 只包含一个抽象方法call,可用于Lambda表达式和方法引用
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param <P> 函数接收的参数类型
|
|
||||||
* @param <R> 函数返回的结果类型
|
|
||||||
*/
|
|
||||||
@FunctionalInterface
|
|
||||||
public interface PRFunction<P, R> {
|
|
||||||
/**
|
|
||||||
* 执行函数调用
|
|
||||||
*
|
|
||||||
* @param p 输入参数
|
|
||||||
* @return 函数执行结果
|
|
||||||
*/
|
|
||||||
R call(P p);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,9 @@ public class SystemUtil {
|
|||||||
return (
|
return (
|
||||||
osName.startsWith("Linux") ||
|
osName.startsWith("Linux") ||
|
||||||
osName.startsWith("AIX") ||
|
osName.startsWith("AIX") ||
|
||||||
osName.startsWith("SunOS")
|
osName.startsWith("SunOS") ||
|
||||||
|
osName.startsWith("Mac OS X") ||
|
||||||
|
osName.startsWith("FreeBSD")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
80
src/com/mingliqiye/utils/version/VersionUtils.java
Normal file
80
src/com/mingliqiye/utils/version/VersionUtils.java
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
package com.mingliqiye.utils.version;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 版本工具类,提供版本比较相关的方法
|
||||||
|
*/
|
||||||
|
public class VersionUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断当前版本是否比另一个版本新
|
||||||
|
*
|
||||||
|
* @param now 当前版本号字符串,格式如"1.0.0"
|
||||||
|
* @param other 要比较的版本号字符串,格式如"2.0.0"
|
||||||
|
* @return 如果当前版本更新则返回true,否则返回false
|
||||||
|
*/
|
||||||
|
public static boolean isNew(String now, String other) {
|
||||||
|
String[] currentParts = now.split("\\.");
|
||||||
|
String[] minimumParts = other.split("\\.");
|
||||||
|
|
||||||
|
for (
|
||||||
|
int i = 0;
|
||||||
|
i < Math.max(currentParts.length, minimumParts.length);
|
||||||
|
i++
|
||||||
|
) {
|
||||||
|
int currentNum = i < currentParts.length
|
||||||
|
? Integer.parseInt(currentParts[i])
|
||||||
|
: 0;
|
||||||
|
int minimumNum = i < minimumParts.length
|
||||||
|
? Integer.parseInt(minimumParts[i])
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
if (currentNum < minimumNum) {
|
||||||
|
return true;
|
||||||
|
} else if (currentNum > minimumNum) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断当前版本是否比另一个版本旧
|
||||||
|
*
|
||||||
|
* @param now 当前版本号字符串,格式如"1.0.0"
|
||||||
|
* @param other 要比较的版本号字符串,格式如"2.0.0"
|
||||||
|
* @return 如果当前版本更旧则返回true,否则返回false
|
||||||
|
*/
|
||||||
|
public static boolean isOld(String now, String other) {
|
||||||
|
return !equals(now, other) && !isNew(now, other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断两个版本号是否相等
|
||||||
|
*
|
||||||
|
* @param now 当前版本号字符串,格式如"1.0.0"
|
||||||
|
* @param other 要比较的版本号字符串,格式如"2.0.0"
|
||||||
|
* @return 如果两个版本号相等则返回true,否则返回false
|
||||||
|
*/
|
||||||
|
public static boolean equals(String now, String other) {
|
||||||
|
return Objects.equals(now, other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 比较两个版本号的大小关系
|
||||||
|
*
|
||||||
|
* @param now 当前版本号字符串,格式如"1.0.0"
|
||||||
|
* @param other 要比较的版本号字符串,格式如"2.0.0"
|
||||||
|
* @return 如果当前版本更新返回2,如果更旧返回0,如果相等返回1
|
||||||
|
*/
|
||||||
|
public static byte is(String now, String other) {
|
||||||
|
if (isNew(now, other)) {
|
||||||
|
return 2;
|
||||||
|
} else if (isOld(now, other)) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user