This commit is contained in:
Looly 2022-08-09 22:21:54 +08:00
parent fb285ed20b
commit 3a08a399da
7 changed files with 32 additions and 28 deletions

View File

@ -685,6 +685,7 @@ public class ListUtil {
* @param otherList 其它列表 * @param otherList 其它列表
* @return 此列表 * @return 此列表
*/ */
@SuppressWarnings("UnusedReturnValue")
public static <T> List<T> addAllIfNotContains(final List<T> list, final List<T> otherList) { public static <T> List<T> addAllIfNotContains(final List<T> list, final List<T> otherList) {
for (final T t : otherList) { for (final T t : otherList) {
if (false == list.contains(t)) { if (false == list.contains(t)) {
@ -695,12 +696,13 @@ public class ListUtil {
} }
/** /**
* 通过删除或替换现有元素或者原地添加新的元素来修改列表并以列表形式返回被修改的内容此方法不会改变原列表
* 类似js的<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice">splice</a>函数 * 类似js的<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice">splice</a>函数
* *
* @param start 起始下标, 可以为负数, -1代表最后一个元素 * @param start 指定修改的开始位置 0 计数, 可以为负数, -1代表最后一个元素
* @param deleteCount 删除个数必须是正整数 * @param deleteCount 删除个数必须是正整数
* @param items 放入 * @param items 放入的元素
* @return 操作后的流 * @return 结果列表
* @since 6.0.0 * @since 6.0.0
*/ */
@SafeVarargs @SafeVarargs

View File

@ -137,7 +137,7 @@ public class Opt<T> {
*/ */
@SuppressWarnings("OptionalUsedAsFieldOrParameterType") @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
public static <T> Opt<T> of(Optional<T> optional) { public static <T> Opt<T> of(Optional<T> optional) {
return ofNullable(optional).flattedMap(Function.identity()); return ofNullable(optional.orElse(null));
} }
/** /**

View File

@ -1063,13 +1063,10 @@ public class Validator {
Assert.notNull(value); Assert.notNull(value);
Assert.notNull(start); Assert.notNull(start);
Assert.notNull(end); Assert.notNull(end);
int c1 = DateUtil.compare(value, start);
int c2 = DateUtil.compare(value, end);
if(c1 >= 0 && c2 <= 0){ if(false == DateUtil.isIn(value, start, end)){
return; throw new ValidateException(errorMsg);
} }
throw new ValidateException(errorMsg);
} }
/** /**

View File

@ -1,7 +1,6 @@
package cn.hutool.core.lang.mutable; package cn.hutool.core.lang.mutable;
import java.io.Serializable; import java.io.Serializable;
import java.util.function.Consumer;
/** /**
* 可变{@code Object} * 可变{@code Object}
@ -9,7 +8,7 @@ import java.util.function.Consumer;
* @param <T> 可变的类型 * @param <T> 可变的类型
* @since 3.0.1 * @since 3.0.1
*/ */
public class MutableObj<T> implements Mutable<T>, Serializable, Consumer<T> { public class MutableObj<T> implements Mutable<T>, Serializable{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
@ -51,17 +50,6 @@ public class MutableObj<T> implements Mutable<T>, Serializable, Consumer<T> {
this.value = value; this.value = value;
} }
/**
* 消费元素
*
* @param t t
* @since 6.0.0
*/
@Override
public void accept(T t) {
this.value = t;
}
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@Override @Override
public boolean equals(final Object obj) { public boolean equals(final Object obj) {

View File

@ -938,7 +938,7 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
*/ */
public Optional<T> findLast() { public Optional<T> findLast() {
MutableObj<T> last = new MutableObj<>(null); MutableObj<T> last = new MutableObj<>(null);
spliterator().forEachRemaining(last); spliterator().forEachRemaining(last::set);
return Optional.ofNullable(last.get()); return Optional.ofNullable(last.get());
} }
@ -1226,7 +1226,7 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
// 保存第二个Spliterator的值 // 保存第二个Spliterator的值
MutableObj<R> value = new MutableObj<>(); MutableObj<R> value = new MutableObj<>();
// 当两个Spliterator中都还有剩余元素时 // 当两个Spliterator中都还有剩余元素时
while (keys.tryAdvance(key) && values.tryAdvance(value)) { while (keys.tryAdvance(key::set) && values.tryAdvance(value::set)) {
map.put(key.get(), value.get()); map.put(key.get(), value.get());
} }
return map; return map;
@ -1394,7 +1394,7 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
// 保存第二个Spliterator的值 // 保存第二个Spliterator的值
MutableObj<U> value = new MutableObj<>(); MutableObj<U> value = new MutableObj<>();
// 当两个Spliterator中都还有剩余元素时 // 当两个Spliterator中都还有剩余元素时
while (keys.tryAdvance(key) && values.tryAdvance(value)) { while (keys.tryAdvance(key::set) && values.tryAdvance(value::set)) {
list.add(zipper.apply(key.get(), value.get())); list.add(zipper.apply(key.get(), value.get()));
} }
return of(list).parallel(isParallel()).onClose(stream::close); return of(list).parallel(isParallel()).onClose(stream::close);

View File

@ -6,8 +6,12 @@ import cn.hutool.core.tree.parser.NodeParser;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Queue;
import java.util.Stack;
/** /**
* 树工具类 * 树工具类
@ -245,7 +249,7 @@ public class TreeUtil {
* @return 森林所有节点列表 * @return 森林所有节点列表
*/ */
public static <E> List<Tree<E>> deepFirstForestConvertToList(List<Tree<E>> forest) { public static <E> List<Tree<E>> deepFirstForestConvertToList(List<Tree<E>> forest) {
if (CollectionUtil.isEmpty(forest)) { if (CollUtil.isEmpty(forest)) {
return null; return null;
} }
List<Tree<E>> list = new ArrayList<>(); List<Tree<E>> list = new ArrayList<>();
@ -261,7 +265,7 @@ public class TreeUtil {
* @return 森林所有节点列表 * @return 森林所有节点列表
*/ */
public static <E> List<Tree<E>> broadFirstForestConvertToList(List<Tree<E>> forest) { public static <E> List<Tree<E>> broadFirstForestConvertToList(List<Tree<E>> forest) {
if (CollectionUtil.isEmpty(forest)) { if (CollUtil.isEmpty(forest)) {
return null; return null;
} }
List<Tree<E>> list = new ArrayList<>(); List<Tree<E>> list = new ArrayList<>();
@ -297,7 +301,7 @@ public class TreeUtil {
} }
/** /**
* 度优先,遍历树,将树转换为数组 * 广度优先,遍历树,将树转换为数组
* *
* @param root 树的根节点 * @param root 树的根节点
* @param <E> 节点ID类型 * @param <E> 节点ID类型

View File

@ -15,6 +15,7 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
public class ListUtilTest { public class ListUtilTest {
@ -266,4 +267,16 @@ public class ListUtilTest {
ListUtil.setOrPadding(list, 3, "a"); ListUtil.setOrPadding(list, 3, "a");
Assert.assertEquals(4, list.size()); Assert.assertEquals(4, list.size());
} }
@Test
public void ofCopyOnWriteTest(){
final CopyOnWriteArrayList<String> strings = ListUtil.ofCopyOnWrite(ListUtil.of("a", "b"));
Assert.assertEquals(2, strings.size());
}
@Test
public void ofCopyOnWriteTest2(){
final CopyOnWriteArrayList<String> strings = ListUtil.ofCopyOnWrite("a", "b");
Assert.assertEquals(2, strings.size());
}
} }