Java12向Stream API的Collectors中引入了一种新方法,可以对集合执行两种不同的操作,然后合并结果。
Collectors的新API
Collectors.teeing()方法的声明
public static <T, R1, R2, R>
Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1,Collector<? super T, ?, R2> downstream2,BiFunction<? super R1, ? super R2, R> merger) {
}
这个方法接受两个收集器downstream1和downstream2,以及一个BiFunction函数merger作为参数。在收集元素时,会同时使用这两个收集器,并且将它们的结果传递给merger函数来合并成一个最终的结果。
Collectors.teeing()方法的使用
package com.morris.java12;import java.util.stream.Collectors;
import java.util.stream.Stream;/*** Collector.teeing()方法的使用*/
public class CollectorTeeingDemo {public static void main(String[] args) {double mean= Stream.of(1, 2, 3, 4, 5, 6, 7).collect(Collectors.teeing(Collectors.summingDouble(i -> i), Collectors.counting(),(sum, n) -> sum / n));System.out.println(mean); // 4}
}
Completionstage的新API
CompletionStage是Java8引入的并发编程工具,用于表示一个异步计算的futrue或promise。
在Java12中,增加了exceptionallyAsync和exceptionallyComposeAsync方法。
exceptionallyAsync方法
exceptionallyAsync方法是在原有的 exceptionally 方法基础上增加了异步执行的能力。当原有的CompletionStage执行失败时,会执行exceptionally方法中的函数。
package com.morris.java12;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;/*** 演示CompletionStage.exceptionallyAsync的使用*/
public class CompletionStageDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {CompletableFuture<Integer> stage = CompletableFuture.supplyAsync(() -> {throw new RuntimeException("Something went wrong");});stage.exceptionallyAsync(e -> {// 处理异常System.out.println(e.getMessage());return 0; // 返回一个默认值}).thenAccept(System.out::println); // 输出 0stage.get();}
}
exceptionallyComposeAsync方法
exceptionallyComposeAsync方法是在原有的exceptionallyCompose方法基础上增加了异步执行的能力。当原有的 CompletionStage执行失败时,会执行exceptionallyCompose方法中的函数,并返回一个新的CompletionStage。
package com.morris.java12;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;/*** 演示CompletionStage.exceptionallyComposeAsync的使用*/
public class CompletionStageDemo2 {public static void main(String[] args) throws ExecutionException, InterruptedException {CompletableFuture<Integer> stage = CompletableFuture.supplyAsync(() -> {throw new RuntimeException("Something went wrong");});stage.exceptionallyComposeAsync(e -> {// 处理异常并返回一个新的CompletionStageSystem.out.println(e.getMessage());return CompletableFuture.completedFuture(0);}).thenAccept(System.out::println); // 输出 0stage.get();}
}