流式编程:
以下是常用的场景和对应的使用实例,以表格形式呈现:
| 场景 | 使用实例 |
|---|---|
| 数据转换和映射 | 将集合中的每个元素转换为大写字母:List result = list.stream().map(String::toUpperCase).collect(Collectors.toList()); |
| 数据过滤 | 过滤出集合中满足特定条件的元素:List result = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()); |
| 数据排序 | 对集合中的元素进行排序:List result = names.stream().sorted().collect(Collectors.toList()); |
| 数据分组 | 根据指定的属性将集合中的元素进行分组:Map<String, List> result = people.stream().collect(Collectors.groupingBy(Person::getCity)); |
| 数据统计和聚合 | 对集合中的元素进行统计和聚合操作,如计数、求和、平均值等:int count = list.stream().count(); double sum = numbers.stream().sum(); OptionalDouble average = scores.stream().mapToInt(Integer::intValue).average(); |
| 并行处理 | 并行处理集合中的元素以提高计算效率:list.parallelStream().forEach(System.out::println); 并行处理,元素的顺序可能会被打乱 |
| IO流处理 | 对文件内容进行逐行处理:Files.lines(Paths.get("file.txt")).forEach(System.out::println); |
| 数据去重 | 去除集合中的重复元素:List result = numbers.stream().distinct().collect(Collectors.toList()); |
| 数据切片 | 对集合中的元素进行分页或限制数量:List page = list.stream().skip(offset).limit(pageSize).collect(Collectors.toList()); |
| 数据匹配和查找 | 判断集合中是否有满足特定条件的元素:boolean anyMatch = list.stream().anyMatch(s -> s.length() > 5); Optional firstMatch = list.stream().filter(s -> s.startsWith("A")).findFirst(); |
| 数据拼接和归约 | 将集合中的元素拼接成一个字符串或归约成单个值:String result = list.stream().collect(Collectors.joining(", ")); int sum = numbers.stream().reduce(0, (a, b) -> a + b); |
以下是关于Lambda表达式和函数式接口的详细说明和示例:
| 概念 | 说明 | 示例 |
|---|---|---|
| Lambda 表达式 | 是一种匿名函数,可以作为参数传递给方法或存储在变量中。Lambda 表达式由参数列表、箭头符号和表达式主体组成。 | (x, y) -> x + y - 接受两个参数并返回它们的和。 () -> System.out.println("Hello") - 不接受参数,直接打印输出 "Hello"。 |
| 函数式接口 | 是只包含一个抽象方法的接口。函数式接口用于支持 Lambda 表达式的使用。Java 8 引入了 @FunctionalInterface 注解来标识一个接口是函数式接口。 | Runnable - 只包含一个无参数无返回值的抽象方法 run()。 Function<T, R> - 包含一个参数和一个返回值的抽象方法 apply(T t)。 |
示例:
-
Lambda 表达式示例:
// 接受两个参数并返回它们的和
MathOperation addition = (int a, int b) -> a + b;
// 不接受参数,直接打印输出
GreetingService greeting = () -> System.out.println("Hello");
// 使用 Lambda 表达式作为参数传递给方法
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(n -> System.out.println(n));
-
函数式接口示例:
// Runnable 接口的使用
Runnable runnable = () -> System.out.println("This is a Runnable");
Thread thread = new Thread(runnable);
thread.start();
// Function 接口的使用
Function<Integer, String> converter = (num) -> {
if (num % 2 == 0) {
return "even";
} else {
return "odd";
}
};
String result = converter.apply(5); // 调用 apply 方法,传递参数并得到返回值
System.out.println(result); // 输出结果为 "odd"
这些示例展示了Lambda表达式和函数式接口在Java中的用法。Lambda表达式可以简化代码,并使其更具可读性。函数式接口则提供了一种定义和使用Lambda表达式的方式。
CompletableFuture的使用
**
**
CompletableFuture流式使用