【发布时间】:2022-10-24 22:43:49
【问题描述】:
我正在使用一个大型数据结构,我想在其中执行一系列模式的流操作:
<some stream>
.map(<method reference getter that returns List>).filter(Objects::nonNull).flatMap(Collections::stream)
.map(<method reference getter that returns another sub-List>).filter(Objects::nonNull).flatMap(Collections::stream)
.forEach(<perform some operations>)
我想编写一个定义,将map、filter 和flatMap 操作抽象为一个函数,我可以使用map 将其应用于流或将流传递给;在我看来,它看起来像这样:
private static final <T,R> BiFunction<Stream<T>, Function<T,List<R>>, Stream<R>> mapAndFlatten =
(inStream, lstGetter) -> {
return inStream.map(lstGetter)
.filter(Objects::nonNull)
.flatmap(Collections::stream);
}
但是,我没有正确地概念化一些事情。一方面,上述语法不正确;很明显我不能使用带有BiFunction 的泛型吗?是否有现有的框架/模式来完成我想要做的事情?组合构成后续map 操作的函数似乎很简单,那么添加filter 和flatMap 是否让我很难开发解决方案?我正在努力寻找有用的信息/示例。我是否以一种没有意义的方式将 OO 和功能概念混为一谈?
也许我为不需要存在的解决方案而努力工作;写.filter(Objects::nonNull).flatmap(Collections::stream) 并不难,但感觉很冗长。
【问题讨论】:
-
您不能为变量或字段声明指定泛型参数。但是,您可以将整个字段/lambda 变成方法
<T,R> Stream<R> mapAndFlatten(Stream<T> inStream, Function<T, List<R>> lstGetter) { ... },但您需要传递 Stream 本身。请记住,流操作中的 lambda 在单个元素,而不是整个流。此外,功能接口与方法签名同构(“相同”),实际上由方法签名指定。
标签: java functional-programming java-stream method-reference functional-interface