我目前正在开发一个Java项目,该项目将使用lambda表达式直接更新信息。在此代码中,Item 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);
}
答案 0 :(得分:1)
我认为最干净的方法是将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)
BTW,为什么不在创建数组时使用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;
} ), .... );