gpt4 book ai didi

Java 8 流 : Collapse/abstract streams parts

转载 作者:搜寻专家 更新时间:2023-10-30 21:04:10 26 4
gpt4 key购买 nike

假设我有这个流:

list.stream()
.map(fn1) // part1
.map(fn2) //
.filter(fn3) //

.flatMap(fn4) // part 2
.map(fn5) //
.filter(fn6) //
.map(fn7) //
.collect(Collectors.toList())

我怎样才能让它看起来像:

list.stream()
.map(fnPart1)
.map(fnPart2)
.collect(Collectors.toList())

无需手动展开 fnX 部件并将它们放在一起(出于维护原因,我想保持它们不变,并用它们表达 fnPartX)。

最佳答案

你可以用函数来表达和组合它:

Function<Stream<T1>, Stream<T2>> fnPart1 = 
s -> s.map(fn1)
.map(fn2)
.filter(fn3);
Function<Stream<T2>, Stream<T3>> fnPart2 =
s -> s.flatMap(fn4)
.map(fn5)
.filter(fn6)
.map(fn7);

fnPart1.andThen(fnPart2).apply(list.stream()).collect(Collectors.toList());

函数的输入和输出类型必须相应匹配。

这可以作为更复杂的组合构造的基础,例如:

public class Composer<T>{
private final T element;

private Composer(T element){
this.element = element;
}

public <T2> Composer<T2> andThen(Function<? super T, ? extends T2> f){
return new Composer<>(f.apply(element));
}

public T get(){
return element;
}

public static <T> Composer<T> of(T element){
return new Composer<T>(element);
}
}

可以这样使用:

Composer.of(list.stream())
.andThen(fnPart1)
.andThen(fnPart2)
.get()
.collect(Collectors.toList());

关于Java 8 流 : Collapse/abstract streams parts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42316399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com