*****************************************************************************
java8编程知识,流式特性可参考http://www.php.cn/java-article-353260.html
*****************************************************************************
java8中Map新增了一个computeIfAbsent()方法,判断是否存在key,若存在则返回value,否则则执行函数
// Map.computeIfAbsent(key,Function<T,R>)
public static Long getLong(Integer integer) {
Map<Integer, Long> map = Maps.newHashMap();
long f = map.computeIfAbsent(integer, p -> {
Integer result = p * 2;
return result.longValue();
});
return f;
}
多线程:CompletableFuture
——不使用工厂方法创建CompletableFuture
public CompletableFuture<String> completableFuture() {
CompletableFuture<String> future = new CompletableFuture<>();
new Thread(() -> {
System.out.println("请开始你的表演...");
try {
Thread.sleep(1000L);
// 接受返回值
future.complete("hello World");
} catch (InterruptedException e) {
e.printStackTrace();
// 捕捉线程中抛出的异常,会抛到调用者
future.completeExceptionally(e);
}
})
// 必须启动线程,否则future无法储存返回值
.start();
return future;
}
// 立即返回future,不会被阻塞(等待线程执行结束)
CompletableFuture<String> future = completableFuture();
// join与get方法的目的一样,区别在于空值时get会抛出异常而join则会返回null,此时会阻塞 System.out.println(future.join());
// 输出:请开始你的表演...
hello World
——使用工厂类创建CompletableFuture对象,supplyAsync方法接收Supplier(提供者接口),并保存返回值
public CompletableFuture<String> completableFuture(String hello) {
return CompletableFuture.supplyAsync(() -> hello);
}
——thenCompose线程依赖性:线程B的执行需要线程A的结果值,其中B是同步执行,被阻塞
@Test
public void compose() {
// thenCompose方法接收Function参数,线程A的结果值以value形参传入B线程并返回一个CompletableFuture对象,对象中保存hello World结果值
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello").thenCompose(value -> CompletableFuture.supplyAsync(() -> value + " World"));
String result = future.join();
System.out.println("result = " + result);
}
// 输出:result = hello World
——thenCombine线程合并:线程A和线程B都执行结束后,各自返回一个值,使用BiFunction接口接收这两个结果并进行操作,A,B线程异步执行,B线程不会被阻塞
@Test
public void compose() {
// thenCombine接收CompletionStage和BiFunction参数,两个线程同时执行并返回v1,v2
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello").thenCombine(CompletableFuture.supplyAsync(() -> " world"), (v1, v2) -> v1 + v2);
String result = future.join();
System.out.println("result = " + result);
}
// 输出:result = hello world