将函数列表应用于Java流的.map()方法

时间:2015-06-11 11:35:49

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

我使用NameValuePair(返回lookupFunction)映射Function s流,如下所示:

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>,我想对每个返回的.map()执行Function该怎么办?我该怎么做?

2 个答案:

答案 0 :(得分:3)

如果lookupFunction(nvp.getName())返回一个函数集合,您可以获取该集合的Stream并将每个函数映射到将其应用于NameValuePair的结果:

List<NameValuePair> newParamPairs = paramPairs.stream()
            .flatMap((NameValuePair nvp) -> lookupFunction(nvp.getName()).stream().map(func -> func.apply(nvp)))
            .flatMap(Collection::stream)
            .collect(toList());

答案 1 :(得分:1)

我使用一个将函数集合组合成一个函数的函数。并在我的代码中使用它而不是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))
...