Java Lambda 表达式和对象方法参考



我目前正在开发一个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;
        } ), .... );

最新更新