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

Java 8:将lambda转换为包含闭包的Method实例

宗意蕴
2023-03-14
问题内容

(这很难搜索,因为结果全都与“方法参考”有关)

我想获取一个Methodlambda表达式的实例,以与基于传统反射的API一起使用。应该包括clousure,因此调用thatMethod.invoke(null, ...)应与调用lambda具有相同的效果。

我已经看过MethodHandles.Lookup,但是它似乎只与反向转换有关。但是我想该bind方法可能有助于包括clousure?

编辑:

假设我有lambda扩展功能:

Function<String, String> sayHello = name -> "Hello, " + name;

我有一个遗留框架(SpEL),其API

registerFunction(String name, Method method)

这将Method不带任何this参数调用给定值(即,方法假定为静态)。因此,我需要获得一个Method包含lambda逻辑+ clousure数据的特殊实例。


问题答案:

如果您找不到优雅的方法,这就是丑陋的方法(Ideone)。涉及反射时通常会发出警告:在将来的发行版中可能会中断

public static void main(String[] args) throws Exception {
  Function<String, String> sayHello = name -> "Hello, " + name;
  Method m = getMethodFromLambda(sayHello);
  registerFunction("World", m);
}

static void registerFunction(String name, Method method) throws Exception {
  String result = (String) method.invoke(null, name);
  System.out.println("result = " + result);
}

private static Method getMethodFromLambda(Function<String, String> lambda) throws Exception {
  Constructor<?> c = Method.class.getDeclaredConstructors()[0];
  c.setAccessible(true);
  Method m = (Method) c.newInstance(null, null, null, null, null, 0, 0, null, null, null, null);
  m.setAccessible(true); //sets override field to true

  //m.methodAccessor = new LambdaAccessor(...)
  Field ma = Method.class.getDeclaredField("methodAccessor");
  ma.setAccessible(true);
  ma.set(m, new LambdaAccessor(array -> lambda.apply((String) array[0])));

  return m;
}

static class LambdaAccessor implements MethodAccessor {
  private final Function<Object[], Object> lambda;
  public LambdaAccessor(Function<Object[], Object> lambda) {
    this.lambda = lambda;
  }

  @Override public Object invoke(Object o, Object[] os) {
    return lambda.apply(os);
  }
}


 类似资料:
  • (这很难搜索,因为结果都是关于“方法参考”) 我想为lambda表达式获取一个实例,用于传统的基于反射的API。应该包括clousure,因此调用应该与调用lambda具有相同的效果。 我已经研究了MethodHandles。查找,但它似乎只与反向转换相关。但是我想bind方法可能有助于包含clousure? 编辑: 假设我是lambda Expersion: 我有一个遗留框架(SpEL),它有一

  • 本文向大家介绍groovy 将方法转换为闭包,包括了groovy 将方法转换为闭包的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用&运算符将方法转换为闭包。            

  • 我从. csv文件读取数据到熊猫数据框如下。对于其中一个列,即,我想将列类型指定为。问题是系列缺少/空值。 当我在读取.csv时尝试将列强制转换为整数时,我得到: 或者,在阅读以下内容后,我尝试转换列类型,但这次我得到: 我如何处理这个问题?

  • 我有一个docx4j生成的文件,其中包含几个表格、标题,最后还有一个excel生成的曲线图。 我尝试了许多方法,以将此文件转换为PDF,但没有得到任何成功的结果。 带有xsl fo的Docx4j不起作用,docx文件中包含的大部分内容尚未实现,并以红色文本显示为“未实现” 我在Apache POI中使用的代码如下: 我不知道该怎么做才能得到PDF中的图表,有人能告诉我如何继续吗? 提前感谢。

  • 问题内容: 我从HTML页面中将一个字符串输入到Java HTTPServlet中。根据我的要求,我得到了显示汉字的ASCII码: “&#21487;&#20197;&#21578;&#35785;&#25105;” (无空格) 如何将该字符串转换为Unicode? HTML代码: Java代码: 如果我打印问题[0],则会得到以下值:“&#21487;&#20197;&#21578;&#3578

  • 我想将以下内容从perl5转换为perl6, 它创建一个包含 16 个字符的字符串,其中每个字符都有一个从 0 到 255 的随机选取值。Perl5 不会为这些字符分配任何语义,因此它们可以是字节、Unicode 代码点或其他字符。 我想我能过得去 但是我被困在使用包装上,这是我的尝试, 并且结果可以是错误, 或类似的东西, 我的思路是,打包整数列表将返回一个Buf,然后解码,这将产生所需的Str