java8

Posted antlord

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8相关的知识,希望对你有一定的参考价值。

*****************************************************************************

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

 













以上是关于java8的主要内容,如果未能解决你的问题,请参考以下文章

Java8 Stream针对List先分组再求和最大值最小值平均值等

通过 Java 正则表达式提取 semver 版本字符串的片段

Java 8 新特性总结

Java Lambda

函数式编程

java代码之美(14)---Java8 函数式接口