mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
commit
9dc6159bfe
@ -453,7 +453,9 @@ public class CollectorUtil {
|
|||||||
if (parentPredicate.test(e)) {
|
if (parentPredicate.test(e)) {
|
||||||
parents.add(e);
|
parents.add(e);
|
||||||
}
|
}
|
||||||
|
if (idGetter.apply(e) != null) {
|
||||||
acc.add(e);
|
acc.add(e);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
(left, right) -> {
|
(left, right) -> {
|
||||||
left.addAll(right);
|
left.addAll(right);
|
||||||
|
@ -264,54 +264,6 @@ public class EasyStream<T> extends AbstractEnhancedWrappedStream<T, EasyStream<T
|
|||||||
return new EasyStream<>(stream);
|
return new EasyStream<>(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>将集合转换为树,默认用 {@code parentId == null} 来判断树的根节点
|
|
||||||
* 因为需要在当前传入数据里查找,所以这是一个结束操作 <br>
|
|
||||||
*
|
|
||||||
* @param idGetter id的getter对应的lambda,可以写作 {@code Student::getId}
|
|
||||||
* @param pIdGetter parentId的getter对应的lambda,可以写作 {@code Student::getParentId}
|
|
||||||
* @param childrenSetter children的setter对应的lambda,可以写作{ @code Student::setChildren}
|
|
||||||
* @param <R> 此处是id、parentId的泛型限制
|
|
||||||
* @return list 组装好的树 <br>
|
|
||||||
* eg:
|
|
||||||
* <pre>{@code
|
|
||||||
* List<Student> studentTree = EasyStream.of(students).
|
|
||||||
* toTree(Student::getId, Student::getParentId, Student::setChildren);
|
|
||||||
* }</pre>
|
|
||||||
* @author VampireAchao
|
|
||||||
*/
|
|
||||||
public <R extends Comparable<R>> List<T> toTree(
|
|
||||||
final Function<T, R> idGetter,
|
|
||||||
final Function<T, R> pIdGetter,
|
|
||||||
final BiConsumer<T, List<T>> childrenSetter) {
|
|
||||||
return collect(CollectorUtil.toTree(idGetter, pIdGetter, childrenSetter, isParallel()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 将集合转换为树,自定义根节点的判断条件
|
|
||||||
* 因为需要在当前传入数据里查找,所以这是一个结束操作
|
|
||||||
*
|
|
||||||
* @param idGetter id的getter对应的lambda,可以写作 {@code Student::getId}
|
|
||||||
* @param pIdGetter parentId的getter对应的lambda,可以写作 {@code Student::getParentId}
|
|
||||||
* @param childrenSetter children的setter对应的lambda,可以写作 {@code Student::setChildren}
|
|
||||||
* @param parentPredicate 树顶部的判断条件,可以写作 {@code s -> Objects.equals(s.getParentId(),0L) }
|
|
||||||
* @param <R> 此处是id、parentId的泛型限制
|
|
||||||
* @return list 组装好的树 <br>
|
|
||||||
* eg:
|
|
||||||
* <pre>{@code
|
|
||||||
* List<Student> studentTree = EasyStream.of(students).
|
|
||||||
* .toTree(Student::getId, Student::getParentId, Student::setChildren, Student::getMatchParent);
|
|
||||||
* }</pre>
|
|
||||||
* @author VampireAchao
|
|
||||||
*/
|
|
||||||
public <R extends Comparable<R>> List<T> toTree(
|
|
||||||
final Function<T, R> idGetter,
|
|
||||||
final Function<T, R> pIdGetter,
|
|
||||||
final BiConsumer<T, List<T>> childrenSetter,
|
|
||||||
final Predicate<T> parentPredicate) {
|
|
||||||
return collect(CollectorUtil.toTree(idGetter, pIdGetter, childrenSetter, parentPredicate, isParallel()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 建造者
|
* 建造者
|
||||||
*
|
*
|
||||||
|
@ -184,6 +184,55 @@ public interface TerminableWrappedStream<T, S extends TerminableWrappedStream<T,
|
|||||||
return unwrap().collect(Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapSupplier));
|
return unwrap().collect(Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapSupplier));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>将集合转换为树,默认用 {@code parentId == null} 来判断树的根节点
|
||||||
|
* 因为需要在当前传入数据里查找,所以这是一个结束操作 <br>
|
||||||
|
*
|
||||||
|
* @param idGetter id的getter对应的lambda,可以写作 {@code Student::getId}
|
||||||
|
* @param pIdGetter parentId的getter对应的lambda,可以写作 {@code Student::getParentId}
|
||||||
|
* @param childrenSetter children的setter对应的lambda,可以写作{ @code Student::setChildren}
|
||||||
|
* @param <R> 此处是id、parentId的泛型限制
|
||||||
|
* @return list 组装好的树 <br>
|
||||||
|
* eg:
|
||||||
|
* <pre>{@code
|
||||||
|
* List<Student> studentTree = EasyStream.of(students).
|
||||||
|
* toTree(Student::getId, Student::getParentId, Student::setChildren);
|
||||||
|
* }</pre>
|
||||||
|
* @author VampireAchao
|
||||||
|
*/
|
||||||
|
default <R extends Comparable<R>> List<T> toTree(
|
||||||
|
final Function<T, R> idGetter,
|
||||||
|
final Function<T, R> pIdGetter,
|
||||||
|
final BiConsumer<T, List<T>> childrenSetter) {
|
||||||
|
return collect(CollectorUtil.toTree(idGetter, pIdGetter, childrenSetter, isParallel()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将集合转换为树,自定义根节点的判断条件
|
||||||
|
* 因为需要在当前传入数据里查找,所以这是一个结束操作
|
||||||
|
*
|
||||||
|
* @param idGetter id的getter对应的lambda,可以写作 {@code Student::getId}
|
||||||
|
* @param pIdGetter parentId的getter对应的lambda,可以写作 {@code Student::getParentId}
|
||||||
|
* @param childrenSetter children的setter对应的lambda,可以写作 {@code Student::setChildren}
|
||||||
|
* @param parentPredicate 树顶部的判断条件,可以写作 {@code s -> Objects.equals(s.getParentId(),0L) }
|
||||||
|
* @param <R> 此处是id、parentId的泛型限制
|
||||||
|
* @return list 组装好的树 <br>
|
||||||
|
* eg:
|
||||||
|
* <pre>{@code
|
||||||
|
* List<Student> studentTree = EasyStream.of(students).
|
||||||
|
* .toTree(Student::getId, Student::getParentId, Student::setChildren, Student::getMatchParent);
|
||||||
|
* }</pre>
|
||||||
|
* @author VampireAchao
|
||||||
|
*/
|
||||||
|
default <R extends Comparable<R>> List<T> toTree(
|
||||||
|
final Function<T, R> idGetter,
|
||||||
|
final Function<T, R> pIdGetter,
|
||||||
|
final BiConsumer<T, List<T>> childrenSetter,
|
||||||
|
final Predicate<T> parentPredicate) {
|
||||||
|
return collect(CollectorUtil.toTree(idGetter, pIdGetter, childrenSetter, parentPredicate, isParallel()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region ============ to zip ============
|
// region ============ to zip ============
|
||||||
|
@ -40,7 +40,7 @@ public class AbstractEnhancedWrappedStreamTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testToSet() {
|
public void testToSet() {
|
||||||
final List<Integer> list = asList(1, 2, 3);
|
final List<Integer> list = asList(1, 2, 3);
|
||||||
Set<String> toSet = wrap(list).map(String::valueOf).toSet();
|
final Set<String> toSet = wrap(list).map(String::valueOf).toSet();
|
||||||
Assert.assertEquals(new HashSet<>(asList("1", "2", "3")), toSet);
|
Assert.assertEquals(new HashSet<>(asList("1", "2", "3")), toSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,7 +636,7 @@ public class AbstractEnhancedWrappedStreamTest {
|
|||||||
List<String> zip = wrap(orders).zip(list, (e1, e2) -> e1 + "." + e2).toList();
|
List<String> zip = wrap(orders).zip(list, (e1, e2) -> e1 + "." + e2).toList();
|
||||||
Assert.assertEquals(Arrays.asList("1.dromara", "2.hutool", "3.sweet"), zip);
|
Assert.assertEquals(Arrays.asList("1.dromara", "2.hutool", "3.sweet"), zip);
|
||||||
|
|
||||||
zip = wrap((Stream<? extends Object>) EasyStream.iterate(1, i -> i + 1)).limit(10).zip(list, (e1, e2) -> e1 + "." + e2).toList();
|
zip = this.wrap((Stream<Integer>)EasyStream.iterate(1, i -> i + 1)).limit(10).zip(list, (e1, e2) -> e1 + "." + e2).toList();
|
||||||
Assert.assertEquals(Arrays.asList("1.dromara", "2.hutool", "3.sweet"), zip);
|
Assert.assertEquals(Arrays.asList("1.dromara", "2.hutool", "3.sweet"), zip);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -663,15 +663,15 @@ public class AbstractEnhancedWrappedStreamTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SafeVarargs
|
@SafeVarargs
|
||||||
private static <T> Wrapper<T> wrap(T... array) {
|
private final <T> Wrapper<T> wrap(final T... array) {
|
||||||
return new Wrapper<>(Stream.of(array));
|
return new Wrapper<>(Stream.of(array));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> Wrapper<T> wrap(Iterable<T> iterable) {
|
private <T> Wrapper<T> wrap(final Iterable<T> iterable) {
|
||||||
return new Wrapper<>(StreamSupport.stream(iterable.spliterator(), false));
|
return new Wrapper<>(StreamSupport.stream(iterable.spliterator(), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> Wrapper<T> wrap(Stream<T> stream) {
|
private <T> Wrapper<T> wrap(final Stream<T> stream) {
|
||||||
return new Wrapper<>(stream);
|
return new Wrapper<>(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -683,12 +683,12 @@ public class AbstractEnhancedWrappedStreamTest {
|
|||||||
* @param stream 包装的流对象
|
* @param stream 包装的流对象
|
||||||
* @throws NullPointerException 当{@code unwrap}为{@code null}时抛出
|
* @throws NullPointerException 当{@code unwrap}为{@code null}时抛出
|
||||||
*/
|
*/
|
||||||
protected Wrapper(Stream<T> stream) {
|
protected Wrapper(final Stream<T> stream) {
|
||||||
super(stream);
|
super(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Wrapper<T> wrap(Stream<T> source) {
|
public Wrapper<T> wrap(final Stream<T> source) {
|
||||||
return new Wrapper<>(source);
|
return new Wrapper<>(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user