当前位置: 首页 > 面试题库 >

嵌套BiFunction的深度(或限制,如果有的话)是多少?

李文轩
2023-03-14
问题内容

我一直在玩BiFunctionjava.util.function)。我举了一些例子,我有一个问题。

BiFunction可以嵌套多少次操作?它像嵌套一个想像的add(a, b) 方法一样简单,次数多达一次吗?

例如三个嵌套 theFunction.apply()

public static int methodContainingMethod
         (int a, int b, int c, BiFunction<Integer, Integer, Integer> theFunction) {
    return theFunction.apply(theFunction.apply(theFunction.apply(a,b),c),c),c);
}

四个嵌套 theFunction.apply()

return
  theFunction.apply(theFunction.apply(theFunction.apply(theFunction.apply(a,b),c),c),c),c);

不断增加…嵌套的数量会不断增加,我测试了十次以上的嵌套功能。

对于需要嵌套多少,我没有确切的要求。但是我很好奇可以嵌套多少次?


问题答案:

首先,这不是特定的BiFunction。因此,您基本上是在问,您可以嵌套方法调用的深度有多深,简单的答案是Java编程语言本身并未指定限制。

有一些技术限制可能会限制数量,但是,这是技术限制,而不是规格限制。当技术发展而无需更改规格时,它们可能会被解除。

正如AlainO’Dea所解释的,如果最后一条指令应由异常处理html" target="_blank">程序覆盖,则方法的代码大小限制为65535字节或65534字节。此代码大小支持的嵌套方法调用的数量取决于某些因素。例如,您正在使用interface和接口方法调用,而不是具体的类方法调用(调用虚拟指令)使用更多的字节,而且,您正在使用BiFunction<Integer,Integer, Integer>而不是简单明了,IntBinaryOperator因此每次调用都涉及将int值装箱,这需要附加代码。

但是无论如何,还有另一个技术限制,即编译器实现。尝试以较高的嵌套计数编译示例时,javac从命令行以1500嵌套调用终止了stackoverflow,而Netbeans(使用与相同的编译器代码javac)设法在IDE开始表现出奇怪行为之前编译了2000嵌套调用。
(我猜想,它不能很好地处理编译器/语法荧光笔的堆栈溢出)。

这表明IDE具有更高的堆栈大小,或者环境设置中的其他差异影响了表达式解析之前的初始堆栈深度。由此得出结论,实践中没有硬性限制。您也许可以编写一个编译器可以毫无问题地编译而另一个编译器却可以解决的代码,这不是一个好主意。

毕竟,等价于您问题的代码可以写成:

public static int methodContainingMethod(
    int a, int b, int c, BiFunction<Integer, Integer, Integer> theFunction) {

    int value = theFunction.apply(a, b);
    for(int i=0; i<asDeepAsYouWannaGo; i++)
        value=theFunction.apply(value, c);
    return value;
}

尽管我认为您的想法更像是:

public static int methodContainingMethod(
    IntBinaryOperator theFunction, int first, int second, int... rest) {

  int value = theFunction.applyAsInt(first, second);
  for(int next: rest) value=theFunction.applyAsInt(value, next);
  return value;
}

要么

public static OptionalInt methodContainingMethod(
    IntBinaryOperator theFunction, int... arguments) {

  return IntStream.of(arguments).reduce(theFunction);
}


 类似资料:
  • 我一直在玩()。我举了一些例子,我有一个问题。 该操作与双函数嵌套的次数是否有限制?它是否像嵌套一个假设的方法一样简单? e、 g.三个嵌套的 四个嵌套的 不断地...嵌套的数量可以不断增加,我用嵌套功能测试了十多次。 我没有确切的要求,需要多少嵌套。。。但我很好奇,这样的鸟巢能做多少?

  • 问题内容: 有一个简单的POJO- 内部带有子类别。嵌套可能会很深,因为每个子类别都可能包含子子类别,依此类推。我想通过jersey 返回为REST资源,序列化为json(由jackson提出)。问题是,我不能真正限制序列化的深度,因此所有类别树都可以序列化。 有没有办法在完成第一级(即具有其第一级子类别)后立即停止对杰克逊进行序列化的对象? 问题答案: 如果可以从POJO中获取当前深度,则可以使

  • 问题内容: 一个作业有一个真正的问题(和头痛)… 我在入门编程班上,我必须写一个函数,给定一个列表,该函数将返回其达到的“最大”深度。例如:[1,2,3]将返回1,[ 1,[2,3]]将返回2 … 我已经编写了这段代码(这是我能得到的最好的T_T) 但是,它显然不像应有的那样工作,因为如果存在不计入最大深度的列表,它仍然会增加计数器… 例如:当我将函数与[1,2,[3,4],5,[6],7]一起使

  • 问题内容: 我正在尝试复制嵌套列表,但是 不 使用该函数不知道该如何做。 我用了: 和 但事实证明,它们全都是浅表。 有什么提示吗? 问题答案: 我的模拟输入: 策略:遍历传入对象的每个元素,递归地下降到也可迭代的元素中,并创建相同类型的新对象。 无论它是全面的还是没有错误的,我都不会提出任何主张[1](不要传递引用自己的对象!),但是应该让您入门。 [1]真的!这里的重点是演示,而不是涵盖所有可

  • 问题内容: 示例文档中有一个简化的文档。这对我理解非嵌套类型与嵌套类型的聚合差异很有帮助。但是,这种简化掩盖了进一步的复杂性,因此我不得不在这里扩展这个问题。 所以我的实际文件更接近以下内容: 因此,我保留了,和的关键属性,但隐藏了许多其他使情况复杂化的内容。首先,请注意,与引用的问题相比,有很多额外的嵌套:在根和“项目”之间,以及在“项目”和“ item_property_1”之间。此外,还请注