(全文目录:)
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
Java 8 引入的 Lambda 表达式,使得函数式编程思想能够在 Java 中得以实现,它极大地简化了代码,提高了代码的可读性和可维护性。通过 Lambda 表达式,我们可以将行为传递给方法,减少冗长的代码结构,尤其在集合框架和流操作中表现尤为突出。今天,我们将深入了解 Lambda 表达式的相关概念、语法、方法引用及其在集合操作中的应用。
30.1 函数式接口概念
函数式接口是一个包含一个抽象方法的接口,目的是为了能够在 Lambda 表达式中使用。Java 8 引入了一个新的注解 @FunctionalInterface
,用来标识一个接口是函数式接口。虽然 @FunctionalInterface
不是强制的,但它可以帮助我们避免接口定义中出现不小心定义了多个抽象方法的错误。
30.1.1 函数式接口的特性
- 函数式接口可以有多个默认方法或静态方法,但只能有一个抽象方法。
- 这些接口通常用于Lambda表达式的目标类型,即表示一个行为或操作。
@FunctionalInterface
interface Calculator {
int add(int a, int b); // 单个抽象方法
// 可以有默认方法
default void printMessage() {
System.out.println("Calculator interface");
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = (a, b) -> a + b; // 使用Lambda表达式
System.out.println(calculator.add(5, 3)); // 输出:8
}
}
30.2 Lambda 语法和使用
Lambda 表达式的核心语法非常简洁,它允许我们通过一种简洁的方式来实现接口中的抽象方法。Lambda 表达式的基本语法结构如下:
(parameters) -> expression
- parameters:方法的参数列表,可以有多个参数,也可以没有参数。
- ->:Lambda 操作符,用来将参数和方法体分开。
- expression:方法体,可以是一个表达式,也可以是多行语句。
30.2.1 简单示例
// Lambda 表达式:无参数
Runnable r = () -> System.out.println("Hello, Lambda!");
r.run(); // 输出:Hello, Lambda!
30.2.2 带参数的 Lambda 表达式
// Lambda 表达式:有参数
BinaryOperator<Integer> add = (a, b) -> a + b;
System.out.println(add.apply(5, 3)); // 输出:8
30.2.3 多行语句的 Lambda 表达式
当 Lambda 表达式包含多行代码时,我们需要使用大括号 {}
来包裹方法体,并且显式使用 return
语句返回值。
BinaryOperator<Integer> multiply = (a, b) -> {
int result = a * b;
return result;
};
System.out.println(multiply.apply(4, 2)); // 输出:8
30.3 方法引用
方法引用是 Lambda 表达式的另一种表现形式,它通过引用已有的方法来代替 Lambda 表达式中的实现代码,使得代码更加简洁。方法引用的语法是 ClassName::methodName
。
30.3.1 静态方法引用
静态方法引用是通过类名直接引用类的静态方法。
class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
BinaryOperator<Integer> add = MathUtil::add; // 静态方法引用
System.out.println(add.apply(5, 3)); // 输出:8
}
}
30.3.2 实例方法引用
实例方法引用是通过对象引用来引用实例方法。
class Printer {
public void printMessage(String message) {
System.out.println(message);
}
}
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
Consumer<String> consumer = printer::printMessage; // 实例方法引用
consumer.accept("Hello, Method Reference!"); // 输出:Hello, Method Reference!
}
}
30.3.3 构造方法引用
构造方法引用用于通过构造器创建对象。
class Person {
String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Main {
public static void main(String[] args) {
Function<String, Person> personCreator = Person::new; // 构造方法引用
Person person = personCreator.apply("John");
System.out.println(person.getName()); // 输出:John
}
}
30.4 Stream API 基础
Java 8 引入了 Stream API,它提供了一种更高效、更简洁的方式来处理集合数据。Stream API 能够对数据集合执行复杂的操作(如过滤、排序、映射等),而且支持链式调用和并行处理。
30.4.1 创建 Stream
可以通过集合的 stream()
方法或者数组的 Arrays.stream()
方法来创建流。
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
// 使用Stream API进行操作
list.stream().filter(s -> s.startsWith("A")).forEach(System.out::println); // 输出:Apple
}
}
30.4.2 Stream 操作
Stream 提供了三种主要操作类型:
- 中间操作:如
filter()
、map()
,它们返回一个新的流,不会改变原始流。 - 终端操作:如
forEach()
、collect()
,它们会消耗流并产生一个结果,无法继续链式调用。 - 短路操作:如
anyMatch()
、allMatch()
,它们会提前结束流的操作。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 中间操作:过滤并映射
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.collect(Collectors.toList());
System.out.println(result); // 输出:[4, 8]
30.4.3 并行流
Stream API 支持并行流,可以轻松地利用多核处理器来加速操作。只需要调用 parallel()
方法即可。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.mapToInt(Integer::intValue)
.sum();
System.out.println(sum); // 输出:15
30.5 Lambda 在集合操作中的应用
Lambda 表达式和 Stream API 密切结合,可以极大地简化集合操作,提升开发效率。下面我们将通过几个常见的集合操作来演示如何使用 Lambda 和 Stream API。
30.5.1 过滤和映射
可以使用 Lambda 表达式来过滤集合中的元素,或通过 map()
方法对集合中的每个元素进行变换。
List<String> names = Arrays.asList("John", "Alice", "Bob", "Emily");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
System.out.println(filteredNames); // 输出:[Alice]
30.5.2 排序
Stream API 还可以进行排序操作,可以使用 sorted()
方法对集合中的元素进行排序。
List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 6);
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出:[1, 2, 5, 6, 8]
30.5.3 收集结果
collect()
是 Stream 的一个终端操作,用于将流的元素收集到一个集合中。
List<String> names = Arrays.asList("John", "Alice", "Bob", "Emily");
Set<String> nameSet = names.stream()
.filter(name -> name.length() > 3)
.collect(Collectors.toSet());
System.out.println(nameSet); // 输出:[Alice, John, Emily]
小结
Lambda 表达式和 Stream API 是 Java 8 中的两项重要特性,它们使得 Java 在函数式编程方面得到了极大的提升。Lambda 表达式使得代码更加简洁、灵活,而 Stream API 提供了一种高效的方式来处理集合数据。方法引用作为 Lambda 表达式的简化形式,使得代码更加清晰。掌握 Lambda 和 Stream 的使用,能帮助你在开发中提高效率,写出更加简洁、易于维护的代码。
... ...
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
... ...
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。 ⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!