当前位置: 首页 > 知识库问答 >
问题:

重用流操作链

秦焱
2023-03-14

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

例如,对于每个流,我要更改字符串的大小写,修剪它,将空字符串清空,然后过滤掉空字符串,最后,消除重复,如下所示:

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

.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()操作是可能的,但是这种操作组合有什么办法吗?

共有1个答案

韦棋
2023-03-14

您可以将包装在函数中

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)
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 below
                     .filter(Objects::nonNull)
                     .distinct();    
    }
}
myStream1.trimAndFilterOutEmptyStringsAndGetDistinctElements()
         .doOtherStuff();
    null
 类似资料:
  • 任何人都可以指向一个官方Java文档,该文档描述了流将调用每个元素的每个“无干扰和无状态”中间操作的次数。 例如: 以上代码当前将调用< code>check方法4次。 在JDK的当前或未来版本中,方法的执行次数是否可能多于或少于从List或任何其他标准JavaAPI创建的流中的元素数量?

  • 我有一个对象,“item”,字段为:int:id string:prices 字符串prices包含一个或多个由逗号分隔的价格值。 getStoresaIntList()从对象中的字符串价格返回价格值列表。 以上当然不是我想要的。

  • 注册 点击首页右上角 注册 ,注册成功后 自动登录并跳转至平台"我的场景"; [首页] [注册] [我的场景] 登录 登录成功后获取 当前用户信息并跳转至首页获取 公开场景列表 [登录] [首页] 创建/编辑/预览场景 场景功能: 场景信息:设置场景基本信息,场景名称、场景描述、场景封面、场景视角、场景LOGO、首页展示和场景分享; 图层管理:场景中底图、素材和标绘都会在图层管理中展示,并可编辑删

  • Java流备忘单 根据这张Java流的备忘单,我知道Java流不能改变数据 例如,在下面使用的代码中,我说的对吗?使用forEach终端操作,数据正在发生变化? 我感到困惑的是,对于每个终端操作可以对数据产生副作用,但不会改变数据? 有人能解释一下Foreach是如何允许变异这里的数据的吗?

  • 如何正确地将json读回java类,应用一些更改,然后再次将其写回json?

  • 问题内容: 在深入研究之后,我发现Stream和Collector之间存在许多重复的逻辑,这些逻辑违反了不要重复自己的原则,例如:jdk-9和中的Stream#map&Collectors#mapping,Stream#filter&Collectors#filtering。等等 但自从溪流遵守告诉,不要问得墨meter耳的法则/ 得墨Law律和集热器遵守继承构成原则看来,这是合理的。 我只能想到