java - 无法将内部类转换为 Lambda

标签 java lambda java-8 inner-classes

我正在尝试学习 Java Lambda。

我正在尝试将以下代码转换为 lambda 表示形式,但它不起作用:

private void foo(Data data) {
    Observable.just(data).subscribeWith(new DisposableObserver<Data>() {
        int count = 0;
        int pageCount = 0;

        @Override
        public void onNext(Data data) {
            Timber.e("onNext()");
            count = data.getCount();
            pageCount = data.getPage();
        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
        }

        @Override
        public void onComplete() {
            Log.e("class", "onComplete");
            abc(count, pageCount);
        }
    });
}

private void bar(Data data) {
    Observable.just(data).subscribeWith({
        int count = 0;
        int pageCount = 0;

        data -> {
            Timber.e("onNext()");
            count = data.getCount();
            pageCount = data.getPage();
        },
        e  -> e.printStackTrace(),
        () -> {
            Log.e("class", "onComplete");
            abc(count, pageCount);
        }
    });
}

这给了我错误。我不太确定如何修复它。

最佳答案

您错过了一个重要部分。您不能将任何匿名内部类实例化为 lambda。

引用自here :

The major benefit of java 8 functional interfaces is that we can use lambda expressions to instantiate them and avoid using bulky anonymous class implementation.

函数式接口(interface)的核心属性:它有一个单个抽象方法。

更多详情可查看here例如。

除此之外,我认为真正的答案是在元层面上:你必须了解你在做什么。意思是:你不使用这个或那个概念,因为你听说过它,并且有人说:“那太棒了”。您使用它是因为它在您的上下文中有意义。

当然,只有当您理解这个概念时,您才能决定某件事是否有用、“正确的事情”。换句话说:真正的答案是(暂时)退一步;首先研究 lambda 的概念。然后决定在哪里使用它会给您的代码库带来好处。

最后:正如用户 Holger 在评论中所表达的那样 - 在该内部类中还有另一个禁忌;因为它包含字段;甚至被某些方法“共享”; 阻止将此类转换为单个纯 lambda 的另一个方面。

关于java - 无法将内部类转换为 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43612748/

上一篇:java - 类的构造函数

下一篇:Java MAP 帮助

相关文章:

c++ - 在 C++ 中将多个参数绑定(bind)到成员函数

java-8 - java8流分组和聚合总和排序

java - 无法从 Java 中的 COM 端口读取串行数据

java - 如何查找实体类中没有属性

java - LinkedBlockingQueue.poll(...) 偶尔抛出 InterruptedException

c++ - 接受任何类型的可调用并且知道参数类型

c++ - 我怎样才能 std::sqrt(boost::lambda::placeholder1_type)?

java - 为什么java streams跳过方法强制执行其他操作

java - 使用一个不完全是 JSON 的主体

java - 如何从 JFrame 的中心元素显示不同的页面(已设置为 BorderLayout)