将函数列表应用于 Java 流的 .map() 方法
Apply a list of Functions to a Java stream's .map() method
我将 NameValuePair
的流映射为 lookupFunction
(其中 returns 为 Function
),如下所示:
List<NameValuePair> paramPairs = getParamPairs();
List<NameValuePair> newParamPairs = paramPairs.stream()
.map((NameValuePair nvp) -> lookupFunction(nvp.getName()).apply(nvp))
.flatMap(Collection::stream)
.collect(toList());
但是,如果 lookupFunction
返回的是 Collection<Function>
,我想对每个返回的 Function
执行 .map()
。我该怎么做?
如果 lookupFunction(nvp.getName())
returns 函数集合,您可以获得该集合的 Stream 并将每个函数映射到将其应用于 NameValuePair 的结果:
List<NameValuePair> newParamPairs = paramPairs.stream()
.flatMap((NameValuePair nvp) -> lookupFunction(nvp.getName()).stream().map(func -> func.apply(nvp)))
.flatMap(Collection::stream)
.collect(toList());
我会使用一个将函数集合组合成一个函数的函数。并在我的代码中使用它而不是 lookupFunction
Function<String, Function<NameValuePair, NameValuePair>> composedFun =
x -> lookupFunctions(x)
.stream()
.reduce((fun1, fun2) -> fun1.andThen(fun2))
.orElse(y -> y);
...
.map(nvp -> composedFun.apply(nvp.getName()).apply(nvp))
...
我将 NameValuePair
的流映射为 lookupFunction
(其中 returns 为 Function
),如下所示:
List<NameValuePair> paramPairs = getParamPairs();
List<NameValuePair> newParamPairs = paramPairs.stream()
.map((NameValuePair nvp) -> lookupFunction(nvp.getName()).apply(nvp))
.flatMap(Collection::stream)
.collect(toList());
但是,如果 lookupFunction
返回的是 Collection<Function>
,我想对每个返回的 Function
执行 .map()
。我该怎么做?
如果 lookupFunction(nvp.getName())
returns 函数集合,您可以获得该集合的 Stream 并将每个函数映射到将其应用于 NameValuePair 的结果:
List<NameValuePair> newParamPairs = paramPairs.stream()
.flatMap((NameValuePair nvp) -> lookupFunction(nvp.getName()).stream().map(func -> func.apply(nvp)))
.flatMap(Collection::stream)
.collect(toList());
我会使用一个将函数集合组合成一个函数的函数。并在我的代码中使用它而不是 lookupFunction
Function<String, Function<NameValuePair, NameValuePair>> composedFun =
x -> lookupFunctions(x)
.stream()
.reduce((fun1, fun2) -> fun1.andThen(fun2))
.orElse(y -> y);
...
.map(nvp -> composedFun.apply(nvp.getName()).apply(nvp))
...