高并发之CompletableFuture之函数式流式编程

224 阅读3分钟

流式编程:

以下是常用的场景和对应的使用实例,以表格形式呈现:

场景使用实例
数据转换和映射将集合中的每个元素转换为大写字母: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)。

示例:

  1. 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));

  1. 函数式接口示例:


// 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的使用

Image.png

**
**

CompletableFuture流式使用

Image.png