gpt4 book ai didi

java - 重用流操作链

转载 作者:行者123 更新时间:2023-12-02 18:45:56 33 4
gpt4 key购买 nike

我正在寻找一种可读的方式来重用流操作链。

这个想法是我有一定的操作序列,我想将其应用于其他操作之间的多个流。流之间的其他操作并不相同。

因此,例如,对于每个流,我想更改字符串的大小写,修剪它,使空字符串无效,然后过滤掉空值,最后消除重复项,如下所示:

在这两种情况下,我都会执行以下一系列操作:

.map( String::trim ).map( Strings::emptyToNull ).filter( Objects::nonNull ).distinct()

我目前复制该链并将其放在多个流的其他操作之间:

myStream1.doSomeStuff().map( String::trim ).map( Strings::emptyToNull ).filter( Objects::nonNull ).distinct().doOtherStuff();

myStream2.doSomethingElse().map( String::trim ).map( Strings::emptyToNull ).filter( Objects::nonNull ).distinct().doSomethingElseStill();

有没有好的方法可以避免重写那段代码?显然,两个 map() 操作是可能的,但是有没有办法实现这种操作组合?

最佳答案

你可以包裹你的Stream<String>在函数中

public Stream<String> trimAndFilterOutEmptyStringsAndGetDistinctElements(Stream<String> stream) {
return stream.map(String::trim)
.map(Strings::emptyToNull) // or use not(String::isEmpty) like suggested below
.filter(Objects::nonNull)
.distinct();
}

可以这样使用

Stream<String> myStream1DownStream = trimAndFilterOutEmptyStringsAndGetDistinctElements(myStream1);
Stream<String> myStream2DownStream = trimAndFilterOutEmptyStringsAndGetDistinctElements(myStream2);

myStream1DownStream.doOtherStuff();
myStream2DownStream.doSomethingElseStill();

顺便说一句,我会用

.filter(Predicate.not(String::isEmpty))  

而不是

.map(Strings::emptyToNull)
.filter(Objects::nonNull)

还有一个比较值得商榷的方法,就是使用Lombok的 @ExtensionMethod 实验性特征。 我不会在生产中使用它

然后您将能够扩展 Stream 的功能具有自定义方法的类

public class Extensions {
public static Stream<String> trimAndFilterOutEmptyStringsAndGetDistinctElements(Stream<String> stream) {
return stream.map(String::trim)
.map(Strings::emptyToNull) // or use not(String::isEmpty) like suggested
.filter(Objects::nonNull)
.distinct();
}
}

用法如下

myStream1.trimAndFilterOutEmptyStringsAndGetDistinctElements()
.doOtherStuff();

更多信息

关于java - 重用流操作链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67431839/

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