第17章 Lambda表达式与函数式接口1

preview
需积分: 0 0 下载量 127 浏览量 更新于2022-08-08 收藏 93KB DOCX 举报
Java 8 的发布引入了Lambda表达式和Stream API,这是自Java 5以来对语言的重大改进,极大地提升了代码的简洁性和可读性。Lambda表达式是实现单一抽象方法(SAM)接口的一种简洁语法,它允许程序员以更面向函数的方式编写代码,减少了冗余和提高了代码的可维护性。 ### 17.1 Lambda表达式 #### 17.1.1 Lambda表达式引入 Lambda表达式的使用通常可以分为以下几个示例: 1. **线程创建**:在Java 8之前,创建线程通常需要实现`Runnable`接口并创建匿名内部类。但使用Lambda表达式,我们可以简化这一过程,如下所示: ```java // 传统方式 new Thread(new Runnable() { public void run() { System.out.println("do something.."); } }).start(); // 使用Lambda new Thread(() -> System.out.println("do something..")).start(); ``` 2. **集合遍历**:在遍历集合时,Lambda表达式可以替代传统的`for-each`循环,提高代码的可读性: ```java // 传统方式 List<String> list = Arrays.asList("hello", "java", "atguigu", "lambda"); for (String string : list) { System.out.println(string); } // 使用Lambda list.forEach(System.out::println); ``` 3. **文件过滤**:文件过滤是另一个很好的应用示例,使用Lambda表达式可以简洁地定义过滤规则: ```java // 传统方式 FileFilter filter = new FileFilter() { @Override public boolean accept(File file) { return !file.isDirectory() && file.getName().endsWith(".java"); } }; File[] files = fileDir.listFiles(filter); // 使用Lambda File[] files = fileDir.listFiles(file -> !file.isDirectory() && file.getName().endsWith(".java")); ``` #### 17.1.2 函数式接口 Lambda表达式是基于函数式接口实现的。函数式接口是指只有一个抽象方法的接口,它可以被用作Lambda表达式的类型。虽然任何有单一抽象方法的接口都可以作为Lambda的类型,但为了明确,Java 8引入了一个`@FunctionalInterface`注解来标识这样的接口。 以下是一些Java 8之前的核心函数式接口示例: 1. **`Runnable`**:无返回值的任务,只有一个`run()`方法。 2. **`Callable`**:带有返回值的任务,有一个`call()`方法,用于返回结果。 3. **`Comparator`**:比较两个对象的接口,有一个`compare()`方法,用于确定两个对象的顺序。 4. **`Comparable`**:实现此接口的类可以比较其实例的自然顺序,有一个`compareTo()`方法。 Java 8还添加了一些新的函数式接口,如`Predicate`(用于断言条件)、`Function`(用于转换操作)和`Consumer`(用于消费输入),它们在Stream API中扮演着重要角色。 ### 17.2 Stream API Stream API是Java 8中的另一大创新,它提供了对集合数据进行高效和易读的操作方式。Stream API支持管道操作,可以将一系列操作链接在一起,如过滤、映射和聚合,从而简化了对大量数据的操作。 例如,使用Stream API可以更简洁地完成文件名的过滤和打印: ```java // 使用Stream API Arrays.stream(fileDir.listFiles()) .filter(file -> !file.isDirectory() && file.getName().endsWith(".java")) .forEach(System.out::println); ``` 总结来说,Lambda表达式和Stream API为Java 8带来了更简洁、更具表现力的代码风格,使Java开发者能够充分利用函数式编程的优点,提升开发效率和代码质量。在实际开发中,理解和掌握这些新特性是非常重要的。