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

什么是深度(或限制,如果有的话)嵌套Bi函数

徐旻
2023-03-14

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

该操作与双函数嵌套的次数是否有限制?它是否像嵌套一个假设的add(a,b)方法一样简单?

e、 g.三个嵌套的函数。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);
}

四个嵌套的函数。apply()

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

不断地...嵌套的数量可以不断增加,我用嵌套功能测试了十多次。

我没有确切的要求,需要多少嵌套。。。但我很好奇,这样的鸟巢能做多少?

共有2个答案

贺景铄
2023-03-14

我不知道这有什么固有的表达式级别限制,但实际上它会受到JVM方法大小限制65534字节的限制:

end_pc是排他的这一事实是Java虚拟机设计中的一个历史错误:如果一个方法的Java虚拟机代码正好是65535字节长,并且以一条1字节长的指令结束,那么该指令不能受到异常处理程序的保护。编译器编写器可以通过将任何方法、实例初始化方法或静态初始化器(任何代码数组的大小)生成的Java虚拟机代码的最大大小限制为65534字节来解决这个问题。

资料来源:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.3

卜瀚漠
2023-03-14

首先,这在任何方面都不特定于Bi函数。所以你基本上是在问,你可以嵌套方法调用多深,简单的答案是Java编程语言本身没有指定限制。

技术限制可能会限制数量,但这些是技术限制,而不是规格限制。当技术发展而规范没有变化时,它们可能会被取消。

正如Alain O'Dea所解释的,一个方法的代码大小被限制为65535字节,或者如果最后一条指令应该被异常处理程序覆盖,则限制为65534字节。这个代码大小支持的嵌套方法调用的数量取决于一些因素。例如,您使用的是接口,并且接口方法调用使用的字节数比具体类方法调用使用的字节数多(调用的是虚拟指令),此外,您使用的是BiFC tion

但无论如何,还有另一个技术限制,编译器实现。当试图用更高的嵌套计数编译示例时,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);
}

 类似资料:
  • 问题内容: 我一直在玩()。我举了一些例子,我有一个问题。 BiFunction可以嵌套多少次操作?它像嵌套一个想像的 方法一样简单,次数多达一次吗? 例如三个嵌套 四个嵌套 不断增加…嵌套的数量会不断增加,我测试了十次以上的嵌套功能。 对于需要嵌套多少,我没有确切的要求。但是我很好奇可以嵌套多少次? 问题答案: 首先,这不是特定的。因此,您基本上是在问,您可以嵌套方法调用的深度有多深,简单的答案

  • 问题内容: 在JavaScript中,嵌套函数非常有用:闭包,私有方法以及您拥有的东西。 什么是嵌套PHP函数?有人使用它们吗? 这是我做的小调查 问题答案: 基本上没有,我一直将其视为解析器的副作用。 伊兰·加珀林(Eran Galperin)误认为这些功能是某种私有的,只是在运行之前才声明它们。它们也不是私有范围的,尽管确实延迟了,但它们确实污染了全球范围。作为回调,外部回调仍然只能被调用一次

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

  • 问题内容: 每个元组基数都由自己的类型快速表示(就像我所知道的任何其他强类型编程语言一样),所以我们有 由于我们有几种不同的类型,每个基数一种,因此它们必须是有限的。 在Scala中,最多可达到,在Haskell中,当前限制应为64。 快速的限制(如果有)是多少?另外,类型实现是由编译器生成的还是我找不到的显式实现? 问题答案: 在当前版本的Xcode 6 Beta中,编译失败时,元组的Arity

  • 问题内容: Python中静态嵌套的块数限制为20。也就是说,嵌套19个循环就可以了(尽管非常耗时;很疯狂),但是嵌套20个循环将失败: 有这样的限制的根本原因是什么?有没有增加限额的方法? 问题答案: 此限制不仅适用于循环,还适用于所有其他控制流程块。嵌套控制流块的数量限制在code.h内部定义,常量为: 此常数用于设置Python用于执行名为的异常和循环的堆栈的最大大小。此限制强加于所有框架对