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

时间:2018-01-29 23:16:29

标签: java function lambda reference

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

1 个答案:

答案 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;
        } ), .... );