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

使用reduce(3parameters)函数传递集合-streams java 8

聂建茗
2023-03-14

我试图用Java8的流计算前面两个值的乘法。我想调用一个将返回数组/列表/集合的函数。我正在创建一个列表,并向其添加1,2。

假设列表名是result。

public static void main (String[] args) { 
List<Integer> result = new ArrayList<Integer>();
result.add(1);
result.add(2);
int n = 5; //n can be anything, choosing 5 for this example
res(n, result);
//print result which should be [1, 2, 2, 4, 8]
}
public static List<Integer> res(int n, List<Integer> result ) {
           result.stream()
                 .limit(n)
                 .reduce(identity, (base,index) -> base);

       //return result;
}
<U> U reduce(U identity,
         BiFunction<U,? super T,U> accumulator,
         BinaryOperator<U> combiner)

简言之;我想传递一个有两个值的列表,让函数找到前两个值(1,2)的乘法,并将其添加到列表中,然后找到后两个值(2,2)的乘法,并将其添加到列表中,直到流达到极限。

共有1个答案

柴泰平
2023-03-14

看起来您正在尝试实现一个递归关系。reduce方法将某个函数应用于流中的一堆预先存在的值。您不能使用reduce并从reducer函数中获取一个中间结果并将其“反馈”到流中,这是实现递归关系所需要做的。

使用streams实现递归关系的方法是使用streams工厂方法之一stream.generatestream.iterateiterate工厂似乎提出了最明显的方法。在您的示例中,需要为每个递归函数应用程序保持的状态需要两个int,因此不幸的是,我们必须创建一个对象来保存这些:

static class IntPair {
    final int a, b;
    IntPair(int a_, int b_) {
        a = a_; b = b_;
    }
}

使用此state对象,您可以创建一个实现所需递归的流:

Stream.iterate(new IntPair(1, 2), p -> new IntPair(p.b, p.a * p.b))
List<Integer> output =
    Stream.iterate(new IntPair(1, 2), p -> new IntPair(p.b, p.a * p.b))
          .limit(5)
          .map(pair -> pair.a)
          .collect(Collectors.toList());
System.out.println(output);

[1, 2, 2, 4, 8]
Stream.iterate(new IntPair(0, 1), p -> new IntPair(p.b, p.a + p.b))

您还可以使用stream.generate实现类似的递归关系。这还需要一个助手类。helper类实现结果值的supplier,但它也需要维护状态。因此,它需要是可变的,这在我的书中有点恶心。迭代函数也需要烘焙到生成器对象中。这使得它不如intpair对象灵活,后者可用于创建任意递归。

 类似资料:
  • 陈述 我想去 但是显然没有使用...因为它不是切肉刀,我想了解更多关于函数及其传递参数的方式。 所以我尝试附加一个使用map函数列表的所有元素。但在此之前,是一个方法,而不是一个方法。 最后一个映射函数返回TypeError: 我想知道是否可以将参数传递给使用的方法。感谢

  • 这可能是一个直接的问题,但我尝试了很多选择,但都不起作用。我给出了以下细节供大家参考。Mybatis xml配置:- Postgres功能:- 映射器配置:- 错误面对:- aused:org.apache.ibatis.type.TypeException:使用JdbcType数组为参数#1设置非空时出错。尝试为此参数设置不同的JdbcType或不同的配置属性。原因:java.lang.Clas

  • 问题内容: 有什么方法可以通过引用SASS中的另一个函数或mixin来传递函数或mixin,然后调用引用的函数或mixin? 例如: 问题答案: 在Sass中,函数和混合函数不是 一流 的,这意味着您不能像传递变量那样将它们作为参数传递。 最接近的指令是(Sass 3.2+)。 唯一需要注意的是,您无法看到mixin内部的内容。换句话说,如果仅在mixin 内部定义,则它实际上将不存在,因为不在范

  • 我尝试使用以下代码来完成此操作: 我得到以下输出: sim(测试,“测试”)

  • 在上一个小节中我们学习了混合函数相关的语法特性,或者说是具有返回值的函数。 在 Less 中,我们可以把一个规则集当作一个 mixins 来使用,但是要注意区别两者之间的不同之处。 1. 什么是规则集? Allow wrapping of a css block, defined in a mixin 。——官方定义 慕课解释:把一个值为规则集的变量作为 Mixins 使用。 2. 语法详情 变量

  • Spark 的 API 很大程度上依靠在驱动程序里传递函数到集群上运行。这里有两种推荐的方式: 匿名函数 (Anonymous function syntax),可以在比较短的代码中使用。 全局单例对象里的静态方法。例如,你可以定义 object MyFunctions 然后传递 MyFounctions.func1,像下面这样: object MyFunctions { def func1(