我想知道是否有一种很好的方法可以重用最终不同输出的公共流操作。 下面的例子正是我试图压缩成一步操作的原因:
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
这不仅是一个阅读问题,而且特别是因为我正在重做两次繁重的操作,同时以一种更为迫切的方式我会做一次。
答案 0 :(得分:2)
您有两件事要做:
第一个很简单:
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()