将函数列表应用于 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))
...