Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不
<dependency>
<groupId>com.igeeksky.xtool</groupId>
<artifactId>xtool</artifactId>
<version>1.0.22</version>
<version>1.1.0</version>
</dependency>
```

### 2.2.Gradle

```groovy
implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.22'
implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.1.0'
```

### 2.3.编译安装
Expand Down Expand Up @@ -80,6 +80,8 @@ mvn clean install

| 版本 | 说明 |
| ------ | ------------------------------------------------------------ |
| 1.1.0 | 1. remove @ParameterNames<br />2. add ObjectUtils<br />3. tuple move to root package |
| 1.0.22 | add ImmutableByteArray |
| 1.0.21 | KeyValue 和 ByteArray 增加静态方法 |
| 1.0.20 | Futures 增加 awaitAll 方法 |
| 1.0.19 | 优化 SimpleJSON 实现:如果 field 为 public,即使无 readMethod,也读取属性值 |
Expand Down
32 changes: 16 additions & 16 deletions docs/Reference.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## xtool-1.0.10参考文档
## xtool 参考文档

Author: [Patrick.Lau](mailto:patricklauxx@gmail.com) Version: 1.0.22
Author: [Patrick.Lau](mailto:patricklauxx@gmail.com) Version: 1.0.23

[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![Release](https://img.shields.io/github/v/release/patricklaux/xtool)](https://github.com/patricklaux/xtool/releases) [![Maven Central](https://img.shields.io/maven-central/v/com.igeeksky.xtool/xtool.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22com.igeeksky.xtool%22%20AND%20a:%22xtool%22) [![codecov](https://codecov.io/gh/patricklaux/xtool/branch/main/graph/badge.svg?token=VJ87A1IAVH)](https://codecov.io/gh/patricklaux/xtool) [![Last commit](https://img.shields.io/github/last-commit/patricklaux/xtool)](https://github.com/patricklaux/xtool/commits) [![Join the chat at https://gitter.im/igeeksky/xtool](https://badges.gitter.im/igeeksky/xtool.svg)](https://gitter.im/igeeksky/xtool?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

Expand All @@ -26,14 +26,14 @@ xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不
<dependency>
<groupId>com.igeeksky.xtool</groupId>
<artifactId>xtool</artifactId>
<version>1.0.22</version>
<version>1.1.0</version>
</dependency>
```

#### 1.2.2.Gradle

```groovy
implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.22'
implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.1.0'
```

#### 1.2.3.编译安装
Expand Down Expand Up @@ -2002,11 +2002,11 @@ public class ConcurrentHashTrieTest {

String text = "为什么不准发布?敏感词真敏感!";
List<Found<String>> match = trie.match(text);
Assert.assertEquals("[{\"start\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"start\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", match.toString());
Assert.assertEquals("[{\"begin\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"begin\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", match.toString());

// match 与 matchAll 对比,起始位置 8:contains只返回“敏感”;matchAll 返回了“敏感”和“敏感词”;
List<Found<String>> matchAll = trie.matchAll(text);
Assert.assertEquals("[{\"start\":8, \"end\":9, \"key\":\"敏感\", \"value\":\"敏感\"}, {\"start\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"start\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", matchAll.toString());
Assert.assertEquals("[{\"begin\":8, \"end\":9, \"key\":\"敏感\", \"value\":\"敏感\"}, {\"begin\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"begin\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", matchAll.toString());
}


Expand All @@ -2023,46 +2023,46 @@ public class ConcurrentHashTrieTest {

// match 与 matchAll 对比
List<Found<String>> match = trie.match("xxabcdexx");
Assert.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString());

List<Found<String>> matchAll = trie.matchAll("xxabcdexx");
Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString());


// match 参数变化对比
// 最长匹配;逐字符扫描
match = trie.match("xxabcdexx", true, true);
Assert.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString());

// 最长匹配;跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配
match = trie.match("xxabcdexx", true, false);
Assert.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", match.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", match.toString());

// 最短匹配;逐字符扫描
match = trie.match("xxabcdexx", false, true);
Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString());

// 最短匹配;跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配
match = trie.match("xxabcdexx", false, false);
Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", match.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", match.toString());


// matchAll 参数变化对比
// 逐字符扫描;最大返回数量为Integer.MAX_VALUE
matchAll = trie.matchAll("xxabcdexx", true, Integer.MAX_VALUE);
Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString());

// 跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配;最大返回数量为Integer.MAX_VALUE
matchAll = trie.matchAll("xxabcdexx", false, Integer.MAX_VALUE);
Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", matchAll.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", matchAll.toString());

// 逐字符扫描;最大返回数量为1
matchAll = trie.matchAll("xxabcdexx", true, 1);
Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString());

// 跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配;最大返回数量为1
matchAll = trie.matchAll("xxabcdexx", false, 1);
Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString());
Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString());
}
}
```
Expand Down
2 changes: 1 addition & 1 deletion docs/TODO.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
### 已完成任务

- [X] 【开发】 ByteArray
- [X] 【开发】 ByteArray, ImmutableByteArray
- [X] 【开发】 KeyValue, ExpireKeyValue
- [X] 【开发】 Codec
- [X] 【开发】 Compressor
Expand Down
10 changes: 5 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@

<groupId>com.igeeksky.xtool</groupId>
<artifactId>xtool</artifactId>
<version>1.0.22</version>
<version>1.1.0</version>
<name>xtool</name>
<description>xtool is a very small set of Java tools.</description>
<url>https://github.com/patricklaux/xtool</url>

<properties>
<!-- third party start -->
<jupiter.version>5.10.2</jupiter.version>
<jackson.version>2.15.4</jackson.version>
<!-- third party begin -->
<jupiter.version>5.11.4</jupiter.version>
<jackson.version>2.18.2</jackson.version>
<!-- third party end -->

<!-- maven plugin start -->
<!-- maven plugin begin -->
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.version>3.13.0</maven.compiler.version>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
package com.igeeksky.xtool.core.function.tuple;

import com.igeeksky.xtool.core.annotation.ParameterNames;
package com.igeeksky.xtool.core;

import java.util.function.Function;

Expand All @@ -19,7 +17,6 @@ public class ExpiryKeyValue<K, V> extends KeyValue<K, V> {
* @param value 值
* @param ttl 存活时长
*/
@ParameterNames({"key", "value", "ttl"})
public ExpiryKeyValue(K key, V value, long ttl) {
super(key, value);
this.ttl = ttl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,11 @@
*/


package com.igeeksky.xtool.core.function.tuple;
package com.igeeksky.xtool.core;

import com.igeeksky.xtool.core.annotation.ParameterNames;
import com.igeeksky.xtool.core.lang.ObjectUtils;

import java.io.Serializable;
import java.util.Objects;
import java.util.function.Function;

/**
Expand All @@ -37,7 +36,6 @@ public class KeyValue<K, V> implements Serializable {

private final V value;

@ParameterNames({"key", "value"})
public KeyValue(K key, V value) {
this.key = key;
this.value = value;
Expand Down Expand Up @@ -125,16 +123,20 @@ public static <K, V> KeyValue<K, V> create(K key, V value) {

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof KeyValue<?, ?> keyValue)) return false;

return Objects.equals(getKey(), keyValue.getKey()) && Objects.equals(getValue(), keyValue.getValue());
if (this == o) {
return true;
}
if (!(o instanceof KeyValue<?, ?> kv)) {
return false;
}
return ObjectUtils.deepEquals(getKey(), kv.getKey()) &&
ObjectUtils.deepEquals(getValue(), kv.getValue());
}

@Override
public int hashCode() {
int result = Objects.hashCode(key);
result = 31 * result + Objects.hashCode(value);
int result = ObjectUtils.deepHashCode(key);
result = 31 * result + ObjectUtils.deepHashCode(value);
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,11 @@
*/


package com.igeeksky.xtool.core.function.tuple;
package com.igeeksky.xtool.core;

import com.igeeksky.xtool.core.annotation.ParameterNames;
import com.igeeksky.xtool.core.lang.ObjectUtils;

import java.io.Serializable;
import java.util.Objects;
import java.util.function.Function;

/**
Expand All @@ -31,28 +30,22 @@
*/
public record Pair<K, V>(K key, V value) implements Serializable {

@ParameterNames({"key", "value"})
public Pair {
}
private static final Pair<?, ?> EMPTY = new Pair<>(null, null);

/**
* 获取 key
*
* @return 键
*/
@Override
public K key() {
return key;
public static <K, V> Pair<K, V> create(K key, V value) {
return new Pair<>(key, value);
}

/**
* 获取 value
* 静态工厂:返回不包含值的 {@link Pair} 单例对象
*
* @return 值
* @param <K> 键类型
* @param <V> 值类型
* @return {@link Pair} -- singleton
*/
@Override
public V value() {
return value;
@SuppressWarnings("unchecked")
public static <K, V> Pair<K, V> emptyPair() {
return (Pair<K, V>) EMPTY;
}

public <K1, V1> Pair<K1, V1> map(Function<K, K1> keyMapper, Function<V, V1> valueMapper) {
Expand Down Expand Up @@ -101,16 +94,20 @@ public boolean hasValue() {

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Pair<?, ?> pair)) return false;

return Objects.equals(key(), pair.key()) && Objects.equals(value(), pair.value());
if (this == o) {
return true;
}
if (!(o instanceof Pair<?, ?> pair)) {
return false;
}
return ObjectUtils.deepEquals(key, pair.key()) &&
ObjectUtils.deepEquals(value, pair.value());
}

@Override
public int hashCode() {
int result = Objects.hashCode(key());
result = 31 * result + Objects.hashCode(value());
int result = ObjectUtils.deepHashCode(key);
result = 31 * result + ObjectUtils.deepHashCode(value);
return result;
}

Expand Down

This file was deleted.

10 changes: 8 additions & 2 deletions src/main/java/com/igeeksky/xtool/core/concurrent/Futures.java
Original file line number Diff line number Diff line change
Expand Up @@ -180,15 +180,18 @@ public static int checkAll(int start, Future<?>[] futures) {
* @param start 起始位置,从此位置开始取消未完成的任务
* @param futures 任务列表
*/
public static void cancelAll(int start, Future<?>[] futures) {
public static void cancelAll(int start, Future<?>[] futures, boolean mayInterruptIfRunning) {
int i = start, len = futures.length;
for (; i < len; i++) {
Future<?> future = futures[i];
if (future != null) {
if (future.isDone()) {
continue;
}
future.cancel(true);
if (future.isCancelled()) {
continue;
}
future.cancel(mayInterruptIfRunning);
}
}
}
Expand All @@ -207,6 +210,9 @@ public static void cancelAll(int start, ArrayList<Future<?>> futures) {
if (future.isDone()) {
continue;
}
if (future.isCancelled()) {
continue;
}
future.cancel(true);
}
}
Expand Down
Loading
Loading