feature/net-util
ZhouXY108 2023-06-29 01:20:24 +08:00
commit b1804a5005
13 changed files with 54 additions and 52 deletions

12
pom.xml
View File

@ -69,12 +69,24 @@
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.3.8</version>
<exclusions>
<exclusion>
<groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId>
</exclusion>
</exclusions>
<scope>test</scope>
</dependency>

View File

@ -49,7 +49,7 @@ public final class MapWrapper<K, V> extends AbstractMapWrapper<K, V, MapWrapper<
return new Builder<>(new HashMap<>(initialCapacity, loadFactor));
}
public static <K, V> Builder<K, V> wrapTreeMap() {
public static <K extends Comparable<? super K>, V> Builder<K, V> wrapTreeMap() {
return new Builder<>(new TreeMap<>());
}

View File

@ -42,9 +42,9 @@ public class Predicates {
* .and(StringUtils::isNotEmpty);
* </pre>
*
* @param <T>
* @param predicate
* @return
* @param <T>
* @param predicate {@link Predicate}
* @return {@link Predicate}
*/
public static <T> Predicate<T> of(Predicate<? super T> predicate) {
return predicate::test;

View File

@ -59,7 +59,7 @@ public class DbRecord extends AbstractMapWrapper<String, Object, DbRecord> {
public <T> Set<T> getValueAsSet(String key) {
return this.<Collection<T>>getAndConvert(key)
.map(l -> (l instanceof Set) ? (Set<T>) l : new HashSet<>(l))
.orElse(Collections.<T>emptySet());
.orElse(Collections.emptySet());
}
public OptionalInt getValueAsInt(String key) {

View File

@ -24,5 +24,5 @@ import com.google.common.annotations.Beta;
@Beta
@FunctionalInterface
public interface ResultMap<T> {
T map(ResultSet rs) throws SQLException;
T map(ResultSet rs, int rowNumber) throws SQLException;
}

View File

@ -100,8 +100,9 @@ public class SimpleJdbcTemplate {
}
try (ResultSet rs = stmt.executeQuery()) {
List<T> result = new ArrayList<>();
int rowNumber = 0;
while (rs.next()) {
T e = resultMap.map(rs);
T e = resultMap.map(rs, rowNumber++);
result.add(e);
}
return result;
@ -114,7 +115,7 @@ public class SimpleJdbcTemplate {
return (list.isEmpty()) ? Optional.empty() : Optional.ofNullable(list.get(0));
}
public static final ResultMap<Map<String, Object>> mapResultMap = rs -> {
public static final ResultMap<Map<String, Object>> mapResultMap = (rs, rowNumber) -> {
Map<String, Object> result = new HashMap<>();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
@ -133,7 +134,7 @@ public class SimpleJdbcTemplate {
return queryFirst(sql, params, mapResultMap);
}
public static final ResultMap<DbRecord> recordResultMap = rs -> {
public static final ResultMap<DbRecord> recordResultMap = (rs, rowNumber) -> {
DbRecord result = new DbRecord();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
@ -153,26 +154,26 @@ public class SimpleJdbcTemplate {
}
public Optional<String> queryToString(String sql, Object... params) throws SQLException {
return queryFirst(sql, params, (ResultSet rs) -> rs.getString(1));
return queryFirst(sql, params, (ResultSet rs, int rowNumber) -> rs.getString(1));
}
public OptionalInt queryToInt(String sql, Object... params) throws SQLException {
Optional<Integer> result = queryFirst(sql, params, (ResultSet rs) -> rs.getInt(1));
Optional<Integer> result = queryFirst(sql, params, (ResultSet rs, int rowNumber) -> rs.getInt(1));
return OptionalUtil.toOptionalInt(result);
}
public OptionalLong queryToLong(String sql, Object... params) throws SQLException {
Optional<Long> result = queryFirst(sql, params, (ResultSet rs) -> rs.getLong(1));
Optional<Long> result = queryFirst(sql, params, (ResultSet rs, int rowNumber) -> rs.getLong(1));
return OptionalUtil.toOptionalLong(result);
}
public OptionalDouble queryToDouble(String sql, Object... params) throws SQLException {
Optional<Double> result = queryFirst(sql, params, (ResultSet rs) -> rs.getDouble(1));
Optional<Double> result = queryFirst(sql, params, (ResultSet rs, int rowNumber) -> rs.getDouble(1));
return OptionalUtil.toOptionalDouble(result);
}
public Optional<BigDecimal> queryToBigDecimal(String sql, Object... params) throws SQLException {
return queryFirst(sql, params, (ResultSet rs) -> rs.getBigDecimal(1));
return queryFirst(sql, params, (ResultSet rs, int rowNumber) -> rs.getBigDecimal(1));
}
public int update(String sql, Object... params) throws SQLException {
@ -224,7 +225,7 @@ public class SimpleJdbcTemplate {
}
@FunctionalInterface
public static interface IAtom<T extends Exception> {
public interface IAtom<T extends Exception> {
@SuppressWarnings("all")
void execute() throws SQLException, T;
}

View File

@ -9,33 +9,22 @@ import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;
import java.util.TimeZone;
import org.apache.commons.lang3.StringUtils;
import xyz.zhouxy.plusone.commons.collection.SafeConcurrentHashMap;
import xyz.zhouxy.plusone.commons.collection.MapWrapper;
public class DateTimeUtil {
private static final MapWrapper<String, DateTimeFormatter> DATE_TIME_FORMATTER_CHCHE = MapWrapper
.<String, DateTimeFormatter>wrapHashMap()
.keyChecker(StringUtils::isNotBlank)
.valueChecker(Objects::nonNull)
private static final MapWrapper<String, DateTimeFormatter> DATE_TIME_FORMATTER_CACHE = MapWrapper
.<String, DateTimeFormatter>wrap(new SafeConcurrentHashMap<>())
.keyChecker(pattern -> Assert.isNotBlank(pattern, "The pattern could not be blank."))
.valueChecker(formatter -> Assert.notNull(formatter, "The formatter could not be null."))
.build();
public static DateTimeFormatter getDateTimeFormatter(String pattern) {
if (!DATE_TIME_FORMATTER_CHCHE.containsKey(pattern)) {
synchronized (DateTimeUtil.class) {
if (!DATE_TIME_FORMATTER_CHCHE.containsKey(pattern)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
DATE_TIME_FORMATTER_CHCHE.put(pattern, formatter);
return formatter;
}
}
}
return DATE_TIME_FORMATTER_CHCHE.get(pattern)
.orElseThrow(() -> new IllegalStateException("Formatter does not exist."));
return DATE_TIME_FORMATTER_CACHE.computeIfAbsent(pattern, DateTimeFormatter::ofPattern);
}
public static String toString(String pattern, ZonedDateTime dateTime) {
@ -126,7 +115,7 @@ public class DateTimeUtil {
*
* </p>
*
* @param dateTime {@link Date}
* @param timeMillis
* @param zone
* @return
*/
@ -191,7 +180,7 @@ public class DateTimeUtil {
/**
*
*
* @param dateTime {@link Date}
* @param timeMillis
* @param zone
* @return
*/

View File

@ -60,7 +60,7 @@ public class MoreCollections {
return toConcurrentHashMap(c, keyGenerator, c.size());
}
public static <K, V> TreeMap<K, V> toTreeMap(Iterable<V> c, Function<? super V, K> keyGenerator) {
public static <K extends Comparable<? super K>, V> TreeMap<K, V> toTreeMap(Iterable<V> c, Function<? super V, K> keyGenerator) {
TreeMap<K, V> map = new TreeMap<>();
fillIntoEmptyMap(map, c, keyGenerator);
return map;
@ -106,7 +106,7 @@ public class MoreCollections {
return toConcurrentHashMap(c, keyGenerator, c.length);
}
public static <K, V> TreeMap<K, V> toTreeMap(V[] c, Function<? super V, K> keyGenerator) {
public static <K extends Comparable<? super K>, V> TreeMap<K, V> toTreeMap(V[] c, Function<? super V, K> keyGenerator) {
TreeMap<K, V> map = new TreeMap<>();
fillIntoEmptyMap(map, c, keyGenerator);
return map;

View File

@ -55,16 +55,16 @@ public class OptionalUtil {
}
/**
* {@code Optional<Integer>} {@link OptionalInt}
* {@code Optional<Integer>} {@link OptionalInt}
* <p>
* {@code Optional<Integer>} 使 {@link OptionalInt}
* </p>
*
* @param value
* @param optionalObj {@code Optional<Integer>}
* @return {@link OptionalInt}
*/
public static OptionalInt toOptionalInt(Optional<Integer> objectOptional) {
return optionalOf(objectOptional.orElse(null));
public static OptionalInt toOptionalInt(Optional<Integer> optionalObj) {
return optionalOf(optionalObj.orElse(null));
}
/**
@ -87,11 +87,11 @@ public class OptionalUtil {
* {@code Optional<Long>} 使 {@link OptionalLong}
* </p>
*
* @param value
* @param optionalObj
* @return {@link OptionalLong}
*/
public static OptionalLong toOptionalLong(Optional<Long> objectOptional) {
return optionalOf(objectOptional.orElse(null));
public static OptionalLong toOptionalLong(Optional<Long> optionalObj) {
return optionalOf(optionalObj.orElse(null));
}
/**
@ -114,11 +114,11 @@ public class OptionalUtil {
* {@code Optional<Double>} 使 {@link OptionalDouble}
* </p>
*
* @param value
* @param optionalObj
* @return {@link OptionalDouble}
*/
public static OptionalDouble toOptionalDouble(Optional<Double> objectOptional) {
return optionalOf(objectOptional.orElse(null));
public static OptionalDouble toOptionalDouble(Optional<Double> optionalObj) {
return optionalOf(optionalObj.orElse(null));
}
/**

View File

@ -51,10 +51,11 @@ public class PagingAndSortingQueryParams {
}
public PagingAndSortingQueryParams(String... sortableColNames) {
Set<String> sortableColNameSet = new HashSet<>(sortableColNames.length);
for (String colName : sortableColNames) {
Assert.isNotBlank(colName, "Column name must has text.");
sortableColNameSet.add(colName);
}
Set<String> sortableColNameSet = new HashSet<>(sortableColNames.length);
this.sortableColNames = Collections.unmodifiableSet(sortableColNameSet);
}

View File

@ -42,10 +42,10 @@ public class SnowflakeIdGenerator {
private static final long SEQUENCE_MASK = -1L ^ (-1L << SEQUENCE_BITS);
/** 工作机器 ID (0~31) */
private long workerId;
private final long workerId;
/** 数据中心 ID (0~31) */
private long datacenterId;
private final long datacenterId;
/** 毫秒内序列 (0~4095) */
private long sequence = 0L;
@ -78,7 +78,6 @@ public class SnowflakeIdGenerator {
* ID (线)
*
* @return SnowflakeId
* @throws InterruptedException
*/
public synchronized long nextId() {
long timestamp = timeGen();

View File

@ -28,7 +28,7 @@ class SimpleJdbcTemplateTests {
private static final Logger log = LoggerFactory.getLogger(SimpleJdbcTemplateTests.class);
DataSource dataSource;
final DataSource dataSource;
String[] cStruct = {
"id",

View File

@ -31,7 +31,7 @@ class TreeBuilderTests {
MenuItem.of("C", "C2", "二级菜单C2", "/c/c2"),
MenuItem.of("C", "C3", "二级菜单C3", "/c/c3")
);
List<Menu> menuTree = new TreeBuilder<Menu, String>(
List<Menu> menuTree = new TreeBuilder<>(
menus,
Menu::getMenuCode,
Menu::getParentMenuCode,