我目前正在开发一个Java项目,该项目将使用lambda表达式直接更新信息。 在此代码中,项 o 将使用两个 lambda 表达式,对象将在适当的时间调用这两个表达式进行计算。 我正在使用 lambda 表达式,以便我可以为每个项目定义一个自定义函数(并且宁愿不使用匿名对象(。
我遇到了一个问题,我需要 lambda 函数从执行它的对象(在本例中为 o(获取信息。 我无法编译,因为在函数 o.getObjectWidth(( 内部,IDE 告诉我"o 可能尚未初始化"(此时技术上是正确的(。
有没有其他方法可以在 lambda 表达式中包含引用?
private void addAllItems() {
Color shipColor = Color.GRAY;
//draw the bottom oval
int width = 100;
int height = 90;
Item o = new Item("bov","oval",10,true,shipColor,true,Color.black,
new int[] {0,60,width,height},new int[] {0,0,1,1},
(Function<Integer,Integer>[]) new Function[]{
//update by keyboard x
(n) -> {
return DynamicInfo.getKeyboardX()+o.getObjectWidth()/2;
},
(n)-> {
return DynamicInfo.getKeyboardY()+o.getObjectHeight()/2;
},
null,
null
});
allItems.addItem(o);
}
我认为最干净的方法是Item
与参数一起直接传递给函数本身Integer
。
使用BiFunction
:
BiFunction<Item, Integer, Integer>
lambda 将如下所示:
(i, n) -> {
return DynamicInfo.getKeyboardX()+i.getObjectWidth()/2;
},
(i, n)-> {
return DynamicInfo.getKeyboardX()+i.getObjectWidth()/2;
}
并在Item
内调用函数时传递对自身的引用:
f.apply(this, 4)
顺便说一句,为什么不使用 List 并在创建数组时避免丑陋的强制转换:
Item(...., List< BiFunction<Item, Integer, Integer> > functions, ...)
new Item( ..., Arrays.asList(
(i, n) -> {
return DynamicInfo.getKeyboardX()+i.getObjectWidth()/2;
},
(i, n)-> {
return DynamicInfo.getKeyboardX()+i.getObjectWidth()/2;
} ), .... );