【问题标题】:Using Lambdas to create and populate objects as an argument使用 Lambdas 创建和填充对象作为参数
【发布时间】:2020-12-15 21:54:27
【问题描述】:

与其他语言更直接的 lambda 相比,我发现 Java lambda 语法独特地晦涩难懂...

我的理解是你可以传递一个 lambda 代替对象作为方法的参数,语法类似于

method(() -> { /*code to return value*/ } )

但我无法获得可行的语法。

我想建立一个对象列表,并且我想用唯一的数据(比如 Math.random() 值)填充每个新对象。所以我正在尝试这样做:

ArrayList<MyType> mytypes = new ArrayList<>();
mytypes.add( () -> { MyType m = new MyType(); m.populate(Math.random()); return m } );

但这显然是不合法的,尽管它似乎与现有的最小示例相匹配。我也试过了

mytypes.add( t -> { MyType m = new MyType(); m.populate(Math.random()); return m } );

mytypes.add( MyType t -> { MyType m = new MyType(); m.populate(Math.random()); return m } );

mytypes.add( (MyType t) -> { MyType m = new MyType(); m.populate(Math.random()); return m } );

mytypes.add( { MyType m = new MyType(); m.populate(Math.random()); return m } );

基于网上看到的各种语法,这些语法几乎没有提供任何信息。

那么这有什么问题呢?这个怎么做?这是不可能的吗? (很遗憾,因为大多数其他使用 lambda 的语言似乎都可以直观地做到这一点。)

【问题讨论】:

  • “我的理解是你可以传递一个 lambda 代替对象作为方法的参数”不...
  • 您一直在说“其他语言”,并且似乎声称您了解这些其他语言的 lambda。能给我举个例子吗?因为我不知道任何可以“传递 lambda 代替对象”的语言...
  • @Sweeper 您可以将 lambda 作为对象传递给接受Object 类型参数的方法,如果您将其转换为FunctionalInterface,例如(Function)x -&gt; x。可能不算数,只是说说而已。
  • @Bohemian 在您的评论编辑之前,我在那里困惑了一秒钟......

标签: java methods lambda parameters arguments


【解决方案1】:

Lambda 只能用于需要函数接口实例的地方。功能接口是具有单个抽象方法的接口。 lambda 被编译为实现该接口的实例,而 lambda 主体成为该单一接口方法的实现。

这里:

ArrayList<MyType> mytypes = new ArrayList<>();
mytypes.add( () -> { MyType m = new MyType(); m.populate(Math.random()); return m } );

add 的无重载将函数接口作为参数。因此,上述内容无法编译。它应该写成单独的语句:

ArrayList<MyType> mytypes = new ArrayList<>();
MyType m = new MyType();
m.populate(Math.random());
mytypes.add(m);

为了完整起见,您可以在技术上使用带有技巧的 lambda 来编写它,方法是将 lambda 转换为 Supplier&lt;MyType&gt;,这一个功能接口,然后调用 get 来实际运行 lambda 中的代码。

mytypes.add( ((Supplier<MyType>)(() -> { MyType m = new MyType(); m.populate(Math.random()); return m })).get() );

但是请不要写这样的代码......我不知道在哪些“其他语言”中这是可以接受的,但这不是我们在 中的做法Java.

【讨论】:

  • 我最喜欢你的最后一句话。
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 2022-12-07
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多