JDK8

本贴最后更新于 2439 天前,其中的信息可能已经沧海桑田

1 函数式接口

1.1 定义

  • 函数式接口是只包含一个抽象方法声明的接口,如 java.lang.Runnable

1.2 声明方式

  • @FunctionalInterface

1.3 案例

@FunctionalInterface public interface WorkerInterface { public void dosomething(); } public class WorkInterfaceTest { public static void excute(WorkerInterface workerInterface) { workerInterface.dosomething(); } public static void main(String[] args) { // 运用同名类实现 excute(new WorkerInterface() { @Override public void dosomething() { System.out.println("hello world"); } }); // 用lambda表达式实现 excute(() -> System.out.println("hello world")); } }

运行结果:

hello world hello world

2 Lambda 表达式和函数式接口

2.1 定义

  • 为匿名函数,是没有声明的方法,即无访问修饰符、返回值和名称

2.2 语法

  • (arg1, arg2...) -> { body }
  • (type1 arg1, type2 arg2...) -> { body }

2.3 结构

  • 一个 Lambda 表达式可以有 0 个或多个参数;
  • 参数类型可明确声明,或根据上下文推断。如(int a)与(a)效果相同;
  • 所有参数需在()内,参数之间用逗号隔开。如(a,b)或(int a, int b);
  • 空圆括号代表参数为空;当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a;
  • Lambda 表达式的主体可包含零条或多条语句
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空

2.4 案例

2.4.1 实现 Runnable 接口
public class RunnableLambda { public static void main(String[] args) { // 1.1使用匿名内部类 new Thread(new Runnable() { @Override public void run() { System.out.println("hello world1"); } }).start(); // 1.2使用匿名内部类 Runnable r1 = new Runnable() { @Override public void run() { System.out.println("hello world2"); } }; r1.run(); // 2.1 lambda表达式 new Thread(() -> System.out.println("hello world3")).start();; // 2.2 lambda表达式 Runnable r2 = ()-> System.out.println("hello world4"); r2.run(); } }

结果

hello world1 hello world2 hello world3 hello world4
2.4.2 排序数组
  • 匿名内部类的排序

    public class ArraySortLambda {
    public static void main(String[] args) {
    String[] players = { "Jack", "Tom", "John", "Andy", "Role"};

    // 1.1 使用匿名内部类根据 name 排序 players Arrays.sort(players, new Comparator() { @Override public int compare(String s1, String s2) { return (s1.compareTo(s2)); } }); // java8新特性 Arrays.asList(players).stream().forEach(System.out::println); }

    }

结果

Andy Jack John Role Tom
  • lambda 表达式的排序

    import java.util.Arrays;
    import java.util.Comparator;

    public class ArraySortLambda {
    public static void main(String[] args) {
    String[] players = { "Jack", "Tom", "John", "Andy", "Role"};
    // 排序 1
    Comparator sortByName = (String s1, String s2) -> (s1.compareTo(s2));
    Arrays.sort(players, sortByName);
    // 或者排序二
    Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));

    Arrays.asList(players).stream().forEach(System.out::println); }

    }

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...