
我对lambda表达式和RxJava有疑问。 这些问题大多与对lambda表达式或RxJava的理解不完全有关。 我将尽力解释lambda表达式。 我将分别描述RxJava。
Lambda表达式和RxJava
什么是lambda表达式? Lambda表达式“只是”一种做我们总是可以做的事情的新方法,但是使用匿名内部类是一种更简洁,更省力的新方法。
Java中的匿名内部类是未命名的类,如果您需要重写类或接口方法,则应使用它。 可以从类或接口创建匿名内部类。
例如:
abstract class Animal { abstract void speak(); } Animal a = new Animal() { void speak() { System.out.println("Woff"); } };
在Android上,我们通常使用匿名内部类作为侦听器,例如,用于此类按钮:
Button btn = findViewById(R.id.button); btn.setOnClickListener( new View.OnClickListener() { @Override public void onClick(final View view) {
让我们回到lambda表达式。 这是下一部分,它是先前代码的一部分,被视为匿名内部类。
new View.OnClickListener() { @Override public void onClick(final View view) {
仅当您需要最多重写一种方法时,才能使用Lambda表达式。 对我们来说幸运的是,View.OnClickListener仅包含一个。 看下面的代码。 您认为我们必须删除哪一部分?
new View.OnClickListener() { @Override public void onClick(final View view) {
删除几乎所有代码后,我们需要添加->,如下面的代码所示。 输入参数视图可以像以前一样在函数内部使用。
(view) -> {
在某些情况下,您可能需要在参数中添加类型,如果编译器无法猜测,可以通过在参数之前添加类型来实现:
(View view) -> {
您还可以使用多行代码:
(view) -> { Intent intent = new Intent(context, AuthActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); view.getContext().startActivity(intent); }
如果您的接口带有采用两个参数的方法,则...
interface MyInterface { abstract void onMethod(int a, int b); }
... lambda表达式将如下所示:
(a, b) -> {
如果该方法具有返回类型...
interface MySecondInterface { abstract int onSecondMethod(int a, int b); }
... lambda表达式将如下所示:
(a, b) -> { return a + b; }
但这还不是全部,有些特殊情况会使代码变得更小。 如果您的方法主体仅包含一行代码,则可以删除花括号{} 。 如果删除花括号,则还需要删除分号,并保留以下内容:
(a, b) -> return a + b
我们还有另一件事可以做。 如果我们只有一行代码,那么编译器可以了解是否需要返回的部分,因此我们可以这样保留它:
(a, b) -> a + b
如果我们有多行代码,它将归结为以下内容:
(a, b) -> { a+=1; return a + b; }
那我们做了什么? 我们采取了这个:
new MySecondInterface() { @Override public int onSecondMethod(final int a, final int b) { return a + b; } };
并把它变成了:
(a, b) -> a + b
方法引用仅剩一件事。 假设我们有一个接口,像以前一样,还有一个接受该接口作为参数的方法:
public interface Callback { public void onEvent(int event); } public void myMethod(Callback callback){ }
如果没有lambda表达式,它将看起来像这样:
myMethod(new Callback() { @Override public void onEvent(final int state) { System.out.println(state); } });
和以前一样,添加一个lambda表达式,我们得到以下信息:
myMethod(state -> System.out.println(state));
但这还不是全部。 如果使用的代码是单行代码,并且被调用的函数使用一个参数,则可以通过以下形式传递方法引用:
myMethod(System.out::println);
该参数将自动传递,无需其他代码! 对不对? 希望您学到新知识!