在Retrolambda中使用'this'关键字

时间:2015-09-26 00:38:24

标签: android lambda retrolambda

我对此代码有疑问:

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        } else {
            //noinspection deprecation
            view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
        getDefaultIntent();
    }
});

我想将此代码转换为使用lambda表达式,如下所示:

view.getViewTreeObserver().addOnGlobalLayoutListener(()->{
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    } else {
        //noinspection deprecation
        view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
    getDefaultIntent();
});

但它不起作用,因为现在this没有引用内部类。

2 个答案:

答案 0 :(得分:0)

尝试通知参数,"完整地址"这个的)。

removeGlobalOnLayoutListener(this);

喜欢这些:

removeGlobalOnLayoutListener(MainActivity.this);

当然,您需要告知您的真实姓名。

答案 1 :(得分:0)

根据Java specifications

  

lambda主体中this表示的值与值相同   在周围环境中由this表示。

因此,如果需要使用this来引用匿名对象,则需要使用显式匿名对象,而不是lambda。解决方法是像原始代码一样编写它。

Lambda是一种在很多情况下都很有用的工具,但不需要在所有情况下使用。