专业编程基础技术教程

网站首页 > 基础教程 正文

JDK1.8 Lambda表达式详解和使用

ccvgpt 2024-08-04 12:07:56 基础教程 15 ℃

一:简介

JDK的升级的目的有以下几个:增加新的功能、修复bug、性能优化、简化代码等几个方面,Lambda表达式就是属于简化代码,用于简化匿名实现类,提供一种更加简洁的写法。Lambda表达式在Swift语言中称之为代码块,Lambda表达式可以认为是一种特殊的接口,该接口必须只有一个抽象方法。

JDK1.8 Lambda表达式详解和使用



语法

(参数类型 参数名, 数参数类型 参数名2...) -> { 
    // code
};

小括号()中的内容就是方法中的参数列表包括参数类型、参数名,其中参数类型是可以省略的,当参数个数只有一个时也可以省略掉小括号; 花括号{}中的内容就是方法中的方法体,当方法体中只有一行代码时可以省略{},当方法体中只有一行代码并且需要返回值时也可以省略掉return; 由于Lambda表达式是匿名实现类的简写,是一种特殊的接口,当赋值给一个变量时也少不掉分号;

Lambda表达式的作用

  • 简化匿名实现类的书写
  • 作为函数中的参数来传递

二:示例

示例1:两个参数,一个返回值

IHello 一个很普通的接口,但接口中只能有一个抽象方法

public interface IHello {
    String sayHello(String name, String msg);
}

Main

public class Main {
    public static void main(String[] args) {
        // 将一个Lambda表达式赋值给一个接口,说明Lambda表达式就是一种接口数据类型,只不过该接口只能有一个抽象方法
        // 参数列表可以省略参数类型,可以写成(name, msg),
        // 在JDK1.8中有个叫做类型推断的东西,可以自动推断出参数的类型,
        // 因为IHello中只有一个抽象方法,知道方法了就知道参数列表了,从而就能推出参数类型来
        IHello iHello = (String name, String msg) -> {
            String hello = name + ": " + msg;
            return hello;
        };
        // 调用接口的方法
        String content = iHello.sayHello("mengday", "happy new year everyone!");
        System.out.println(content);
    }
}

示例2:一个参数,一个返回值

public interface IHello {
    String sayHello(String name);
}

Main

public class Main {
    public static void main(String[] args) {
        // 参数列表可以省略参数类型,当只有一个参数时可以省略小括号 (String name) --> (name) --> name
        // 当方法体中只有一行代码并且有返回值时可以同时省略花括号和return
        // { return name + ": " + "happy new year everyone!";} --> name + ": " + "happy new year everyone!";
        IHello iHello = name -> name + ": " + "happy new year everyone!";

        String content = iHello.sayHello("mengday");
        System.out.println(content);
    }
}

示例3:没有参数,没有返回值

public interface IHello {
    void sayHello();
}
public class Main {
    public static void main(String[] args) {
        // 当表达式没有参数时一对小括号是不能省略掉的
        IHello iHello = () -> System.out.println("mengday: happy new year everyone!");
        iHello.sayHello();
    }
}

从这三个示例中我们发现我们只定义了接口,并没有定义实现类,而是通过Lambda表达式来代替了实现类。 注意:Lambda接口只能有一个抽象方法,可以同时拥有多个静态方法和默认方法。


示例4:Lambda表达式参数

public interface IHello {
    void sayHello(String name);
}
public class Main {

    public static void sayHello(IHello iHello, String name) {
        iHello.sayHello(name);
    }

    public static void main(String[] args) {

        IHello iHello = name -> {
            String content = name + ": " + "happy new year everyone!";
            System.out.println(content);
        };

        // 这里可以把iHelo看成一个匿名实现类来传递参数
        sayHello(iHello, "mengday");

        // 如果去掉变量的接收,直接将Lambda表达式传递到参数中,此时Lambda表达式更像是一个函数
        // 也就是说JDK1.8竟然可以将一个函数作为参数传递到方法中,这是之前版本做不到的
        // 将函数作为方法的参数传递,一般用于回调函数,将回调函数传递到方法中
        sayHello(name -> {
            String content = name + ": " + "happy new year everyone!";
            System.out.println(content);
        }, "mengday");
    }
}

示例5:集合排序示例

public static void main(String[] args) {

     // 写法一:使用匿名内部类
     // 好好学习,天天向上
     List<String> words = Arrays.asList("good", "good", "study", "day", "day", "up");

     // public static <T> void sort(List<T> list, Comparator<? super T> c)
     Collections.sort(words, new Comparator<String>() {
         @Override
         public int compare(String s1, String s2) {
             // 降续排序
             return s2.compareTo(s1);
         }
     });

     System.out.println(words);


     // 写法二:使用Lambda表达式
     // 咱俩谁跟谁
     words = Arrays.asList("we", "two", "who", "and", "who");
     Collections.sort(words, (String s1, String s2) -> {return s2.compareTo(s1);});
     System.out.println(words);


     // 写法三:使用Lambda表达式(简写)
     // 有事起奏,无事退朝
     words = Arrays.asList("if", "you", "have", "something", "to", "say", "then", "say!",
             "if", "you", "have", "nothing", "to", "say", "go", "home!");
     Collections.sort(words, (s1, s2) -> s2.compareTo(s1));
     System.out.println(words);
 }

最近发表
标签列表