重用Stream映射和过滤的一部分来组成两个不同的结果

时间:2015-07-01 22:42:47

标签: java lambda functional-programming java-8 java-stream

我想知道是否有一种很好的方法可以重用最终不同输出的公共流操作。 下面的例子正是我试图压缩成一步操作的原因:

List<String> parents = 
    Objects.requireNonNull(
        Exceptions.trying(
            () -> Arrays.asList(Exceptions.dangerous(resource::getParentIds).expecting(CMException.class).throwing(rpe))
                        .stream()
                        .map(cId -> Exceptions.dangerous(cId, resource.getCMServer()::getPolicy).expecting(CMException.class).throwing(rpe))
                        .filter(policy -> PagePolicy.class.isAssignableFrom(policy.getClass()))
                        .map(PagePolicy.class::cast)

请注意,对于两者都重复了第一步:

bindToController

这不仅是一个阅读问题,而且特别是因为我正在重做两次繁重的操作,同时以一种更为迫切的方式我会做一次。

1 个答案:

答案 0 :(得分:2)

您有两件事要做:

  • 避免创建输入数组的冗余工作
  • 避免使用map / filter / map的冗余代码

第一个很简单:

    List<Id> list = Arrays.asList(Exceptions.dangerous(resource::getParentIds)
                    .expecting(CMException.class)
                    .throwing(rpe));

现在,您可以从此源中提取两次流,而无需重新实现它。

下一位只是一个从列表到流的函数:

Function<List<Id>, Stream<Something>> asStream = 
    list -> list.stream().map(...).filter(...).map(...);

现在,用这个开始你的流:

asStream.apply(list).moreStuff().moreStuff()