当前位置: 首页 > 知识库问答 >
问题:

在Java8中,如何将函数列表应用于值?

卢朝
2023-03-14

假设我有这个命令代码:

    List<Function<T, T>> functions = ...
    T value = ...
    for (Function<T, T> function : functions) {
        value = function.apply(value);
    }

我该如何以函数式的方式写这篇文章(就像fold在Scala中做的那样)?

共有2个答案

邓光耀
2023-03-14

这里有一个关于尤金答案的变体,只是为了好玩:

public static <T> Function<T, T> combine(List<Function<T, T>> functions) {
    return new Object() {
        Function<List<Function<T, T>>, Function<T, T>> combiner = list ->
            list.size() == 1 ? list.get(0) :
            list.get(0).andThen(this.combiner.apply(list.subList(1, list.size())));
    }.combiner.apply(functions);
}

这将创建一个具有递归lambda属性的匿名内部类。这个属性被命名为cominer,它是一个高阶函数,它将函数列表作为参数,并作为结果返回函数。如果列表只包含一个元素,则此高阶函数返回列表的第一个函数,或者将andSo应用于列表的第一个函数,该函数的子列表为以第二个元素开始的函数。

需要匿名内部类,因为递归lambda只能定义为类的属性。

不用说,这比使用函数::和二进制运算符对列表进行流式处理和缩减要复杂得多。此外,递归lambda不是免费的:它们使用堆栈进行递归调用。

周奇文
2023-03-14

几小时前刚刚有人向消费者询问这一问题。。。您可以将它们简化为单个函数并应用:

@SafeVarargs
private static <T> Function<T, T> combineF(Function<T, T>... funcs) {
    return Arrays.stream(funcs).reduce(Function.identity(), Function::andThen);
}

 类似资料:
  • 问题内容: 可以说我有一个这样的列表: 我有一个函数,假设我想将该函数应用于该函数的每个子列表,可以计算出有关两个列表的一些分数。如何将此功能应用于的每个列表并在新列表中返回每个分数,如下所示: 我尝试使用以下功能: 问题答案: 您可以使用内置函数来执行此操作。 因此,如果您要应用的函数是,则可以执行以下操作: 在中,上面返回了一个地图迭代器,因此您需要一个显式调用: 如果您要为此编写一些必须在P

  • 我从这个URL刮取了这个表: "https://www.patriotsoftware.com/blog/accounting/average-cost-living-by-state/" 看起来像这样: 然后我编写了这个函数来帮助我将字符串转换成整数: 当我只将函数应用于一列时,它就会工作。我在这里找到了关于在多个列上使用的答案:如何将函数应用于多个列 但我下面的代码不起作用,也不会产生错误:

  • 我有以下函数(一个以列作为输入的热编码函数)。我基本上想把它应用到我的数据框中的一列,但似乎不明白出了什么问题。 猜我怎么称呼它有问题?

  • 在执行时,是否有一种方法可以将聚合函数应用于dataframe的所有列(或列表)?换句话说,是否有一种方法可以避免对每个列都这样做:

  • 怎么办? **添加详细示例如下***

  • 问题内容: 如何将函数应用于变量输入列表?例如,函数返回真值,但不返回函数的实际输出。 预期的输出是: 我知道是内置的。这只是一个例子。 问题答案: 我认为您的意思是使用而不是: 更简单的是,您可以使用而不是从中导入(感谢@alecxe): 在Python 2.x中,通过将给定函数应用于列表中的每个元素来构造新列表。通过限制使用给定函数求值的元素来构造新列表。 在Python 3.x中,和构建迭代