匿名内部类 Lambda表达式 方法引用

目录

1. 匿名内部类

2. Lambda表达式

3. 方法引用

3.1 特定类型方法引用


1. 匿名内部类

是一种特殊的局部内部类,本质上是一个没有名字的抽象类子类对象,或者接口的实现类对象。

用于创建一次性的类实例

目的为了简化书写

new 父类/接口(参数值){
    @Override
    重写父类/接口的方法;
}

只有在调用方法时,当方法的形参是一个接口或者抽象类,为了简化代码书写,而直接传递匿名内部类对象给方法。

匿名内部类不能有构造方法,可以访问外部类的成员变量和方法,但需要将这些成员变量和方法声明为final,或者是事实上是final的。

2. Lambda表达式

jdk8新特性,用来简化 匿名内部类。

使用前置条件:只能是接口,有且仅有一个抽象方法(函数式接口)。

(被重写方法的形参列表) -> {
    被重写方法的方法体代码;
}

3. 方法引用

  • 静态方法引用
  • 实例方法引用
  • 特定类型方法引用
  • 构造器引用
  1. 对象::实例方法名:引用特定对象的实例方法。
  2. 类::静态方法名:引用静态方法。
  3. 类::实例方法名:引用特定类型的任意对象的实例方法。
  4. 构造方法引用:引用构造方法。
interface Greeting {
    void greet(String message);
}

public class Main {
    public static void main(String[] args) {
        // 使用匿名内部类
        Greeting greeting1 = new Greeting() {
            @Override
            public void greet(String message) {
                System.out.println("Hello, " + message + " (Anonymous Inner Class)");
            }
        };
        
        greeting1.greet("world");

        // 使用Lambda表达式
        Greeting greeting2 = message -> System.out.println("Hello, " + message + " (Lambda Expression)");
        
        greeting2.greet("world");

        // 使用方法引用
        Greeting greeting3 = System.out::println;
        
        greeting3.greet("Hello, world (Method Reference)");
    }
}

3.1 特定类型方法引用

特定类型的方法引用是没有什么道理的,只是语法的一种约定,遇到这种场景,就可以这样用。

Java约定:
    如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数作为方法的主调,    后面的所有参数都是作为该实例方法的入参时,则就可以使用特定类型的方法引用。
格式:
    类型::方法名

public class Test2 {
    public static void main(String[] args) {
        String[] names = {"boby", "angela", "Andy" ,"dlei", "caocao", "Babo", "jack", "Cici"};
        
        // 要求忽略首字符大小写进行排序。
        Arrays.sort(names, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 制定比较规则。o1 = "Andy"  o2 = "angela"
                return o1.compareToIgnoreCase(o2);
            }
        });
		
        //lambda表达式写法
        Arrays.sort(names, ( o1,  o2) -> o1.compareToIgnoreCase(o2) );
        //特定类型的方法引用!
        Arrays.sort(names, String::compareToIgnoreCase);

        System.out.println(Arrays.toString(names));
    }
}

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NEUMaple

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值