[java进阶]——方法引用改写Lambda表达式

简介: [java进阶]——方法引用改写Lambda表达式

🌈键盘敲烂,年薪30万🌈



📕概念介绍:

方法引用改写Lambda表达式可简化代码书写,方法引用就是调用已经拥有的方法,学习方法引用是必要的,在java的原码中你会经常看到它,在以后mybatis-plus的学习中会大量使用方法引用。

方法引用的前提条件:

  • 拥有函数式接口
  • 存在引用方法
  • 引用方法同抽象方法的作用相同
  • 引用的方法的形参和返回值类型要与抽象方法保持一致

1.引用静态方法

格式:类名::方法名

代码实现:

    //将集合中的元素转化为int类型并打印     
    List<String> list = new ArrayList<>();
    Collections.addAll(list, "2", "5", "4", "10");
    //Lambda方法
    list.stream().map(new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            return Integer.parseInt(s);
        }
    }).forEach(System.out::println);*/
    //方法引用
    list.stream().map(Integer::parseInt).forEach(System.out::print);

2.引用构造方法

①类的构造:

   格式:类名::new

   注意:类里面要有对应的构造方法(参数名与抽象方法保持一致)

代码实现:

        //将集合里面的字符串封装称user对象
        //原始写法
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌,18", "小昭,19");
        /*List<User> collect = list.stream().map(new Function<String, User>() {
            @Override
            public User apply(String s) {
                String[] split = s.split(",");
                return new User(split[0], Integer.parseInt(split[1]));
            }
        }).collect(Collectors.toList());
        System.out.println(collect);*/
        //引用构造方法
        //类名::new
        List<User> newlist = list.stream().map(User::new).collect(Collectors.toList());
②数组的构造:

   格式:数据类型名[]::new

代码实现:

        //数组的构造方法
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4);
        //原始方法
        Integer[] array = list.stream().toArray(new IntFunction<Integer[]>() {
            @Override
            public Integer[] apply(int value) {
                return new Integer[value];
            }
        });
        //方法引用
        Integer[] array1 = list.stream().toArray(Integer[]::new);

3.引用本类或父类的成员方法

①本类:

   格式:this::方法名 (前提:非静态)

  注意:被引用方法一定不要是静态的,因为静态里面没有this和super关键字

代码实现:

    //升序排序
    public void testmethod1(){
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5);
        // 引用本类中非静态的 this::方法名
        list.stream().sorted(this::method1).forEach(System.out::print);
    }
    public int method1(int o1, int o2){
        return o2 - o1;
    }
①父类:

  格式:super::方法名(前提:非静态)

代码实现:

同上只是将this改为了super

4.引用其他类的方法

格式:对象名::方法名

    public static void main(String[] args) {
        //将集合中的数据封装成User对象
        //引用其他类型的方法
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌,18", "小昭,19");
        List<User> newlist = list.stream().map(new Utils()::method).collect(Collectors.toList());
        System.out.println(newlist);
    }

5.特定类的方法引用

格式:类::方法名

注意:抽象方法的形参从第二个开始到最后与引用方法保持一致,第一个形参用于指明是什么类

代码演示:

        // 将字母转为大写
        //原始方法
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "aaa", "bbb", "ccc");
        List<String> collect = list.stream().map(new Function<String, String>() {
            @Override
            public String apply(String s) {
                return s.toUpperCase();
            }
        }).collect(Collectors.toList());
        System.out.println(collect);
        //方法引用
        //类名::方法名
        //局限:只能引用抽象方法中第一个参数类型里面的方法
        //就像这里只能引用string里面的方法
        //注意 被引用方法的第二个到最后一个形参要与抽象方法保持一致
        List<String> newlist = list.stream().map(String::toUpperCase).collect(Collectors.toList());

🐒总结

相关文章
|
19天前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
21天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
23天前
|
并行计算 Java 编译器
深入理解Java中的Lambda表达式
在Java 8中引入的Lambda表达式,不仅简化了代码编写,还提升了代码可读性。本文将带你探索Lambda表达式背后的逻辑与原理,通过实例展示如何高效利用这一特性优化你的程序。
|
23天前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
37 4
|
23天前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
24 4
|
21天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
24 1
|
18天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
21天前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
24 0
|
1月前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
3月前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。