Lambda表达式的说明

Lambda表达式的说明


我对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) { // Do some fancy stuff with the view parameter. } } ); 

让我们回到lambda表达式。 这是下一部分,它是先前代码的一部分,被视为匿名内部类。


 new View.OnClickListener() { @Override public void onClick(final View view) { // Do some fancy stuff with the view parameter. } } 

仅当您需要最多重写一种方法时,才能使用Lambda表达式。 对我们来说幸运的是,View.OnClickListener仅包含一个。 看下面的代码。 您认为我们必须删除哪一部分?


 new View.OnClickListener() { @Override public void onClick(final View view) { // Do some fancy stuff with the view parameter. } } 

删除几乎所有代码后,我们需要添加->,如下面的代码所示。 输入参数视图可以像以前一样在函数内部使用。


 (view) -> { // Do some fancy stuff with the view parameter. } 

在某些情况下,您可能需要在参数中添加类型,如果编译器无法猜测,可以通过在参数之前添加类型来实现:


 (View view) -> { // Do some fancy stuff with the view parameter. } 

您还可以使用多行代码:


 (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) -> { // Do some fancy stuff with the a and b parameter. } 

如果该方法具有返回类型...


 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); 

该参数将自动传递,无需其他代码! 对不对? 希望您学到新知识!

Source: https://habr.com/ru/post/zh-CN419395/


All Articles