Lambda表达式简化匿名内部类

文章目录

  • Lambda表达式
    • 作用
    • 形式:
    • 例子
  • Lambda终极简化 使用::
    • 语法
    • 例子
    • 解释
  • 总结

Lambda表达式

作用

我们之前已经看到了,当我们用匿名内部类的时候,Idea给我们提示,让我们用Lambda表达式简化匿名内部类,所以Lambda

表达式的出现是为了简化匿名内部类,那么什么样的匿名内部类才能用Lambda表达式简化呢?

  1. 匿名内部类必须是实现的接口
  2. 该接口中只有一个抽象方法

形式:

注意我们参数的类型可以不写,JVM可以通过上下文“类型推断”

(参数1,参数2,····) -> {
    
    //todo, 实现接口的方法体
};

//注意:当参数只有一个的()可以不写, 
 参数1 -> {
     
    //todo
 };


//注意:当实现的方法只有一个语句的时候, return和{}可以省略不写
(参数1,参数2,····) -> //todo ;

例子

举一个例子,我们把之前匿名内部类实现接口的那个例子用Lambda表达式替换

IStudent接口

public interface IStudent {
    default  void say(){
        System.out.println("我是一个从不翘课的学生,嘿嘿");
    }

    void study();			//接口的函数默认的修饰符 是public abstract
}

测试类


import org.junit.Test;

public class testLambda {
    @Test
    //Lambda表达式实现
    public void test01(){
        IStudent iStudent = () ->
            System.out.println("我在学校Lambda表达式");

        iStudent.say();
        iStudent.study();
    }
    
    //匿名内部类实现
    
 @Test
    public void testImplementsInterface(){
        //多态向上转型
        IStudent student = new IStudent() {
            @Override
            public void study() {
                System.out.println("我在天天摸鱼的时候学习");
            }
        };

        student.say();
        student.study();
    }
}

我们发现Lambda表达式确实简化了很多。

两个参数的

public interface IFather {
    void say(int age, int weight);
}




测试类

```java
   @Test
    public void test02(){

        IFather iFather = (age, weight) ->
            System.out.println("年龄:" + age + "   "+ "体重:" +weight);

        iFather.say(25, 75);
    }

Lambda终极简化 使用::

语法

当方法接受的参数和他内部调用参数一致 参数省略,- >省略 用 ::来代替

例子


@FunctionalInterface
public interface Student{
    void say(Object word);
}

用我们熟悉的lambda简化方式

 @Test
    public void test01(){
        Student student = (word -> System.out.println(word));
        student.say("我用lambda表达式简化了")

用::进行究极简化


@Test
    public void test01(){
        Student student1 = (System.out::println);
        student1.say("我调用了::简化开发");
    }

解释

这边传入的参数是Object word, 内部方法的参数也是 Object word,我们将word进行省略,同时省略->用 ::代替

总结

Lambda表达式其实就是在于方法体,把目光集中于方法体的具体实现,我们调用的时候直接调用抽象的接口即可。当我们看见类似(XXX::yyy)时我们要知道这个是一个对象,是匿名内部类,lambda表达式的终极简化即可

你可能感兴趣的:(java基础,java)