【问题标题】:Apply a list of Functions to a Java stream's .map() method将函数列表应用于 Java 流 .map() 方法
【发布时间】:2015-06-11 11:35:48
【问题描述】:

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

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

但是如果 lookupFunction 返回一个 Collection&lt;Function&gt; 而我想对每个返回的 Functions 执行一个 .map() 怎么办。我该怎么做?

【问题讨论】:

  • 注意:你当前的代码可以写成:stream.map(NameValuePair::getName).map(this::lookupFunction)...

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢!看来我仍然需要第二个 .flatMap(Collection::stream)
  • @neu242 为什么?每个 Function::apply 是否返回一个集合而不是单个值?这个问题并不清楚,这就是我删除.flatMap(Collection::stream)的原因。
  • 这将为您提供将不同功能应用于列表的所有成员的所有排列。假设lookupFunction 为您提供 2 个功能,而paramPairs 有 3 个项目,那么这将产生 6 对的列表。不确定这是否是 OP 要求的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多