基础)Note30)lambda表达式Stream流学习十一、十二—Optional、ForkJoin框架、并行流与顺序流

基础)Note30)lambda表达式Stream流学习十一、十二—Optional、ForkJoin框架、并行流与顺序流,第1张

基础)Note30)lambda表达式Stream流学习十一、十二—Optional、ForkJoin框架、并行流与顺序

lambda表达式Stream流学习十—Stream *** 作练习题,map、sorted、collect、filter、forEach、max、min

一,Optional

  Optional类(java.util.Optional)是一个容器,代表一个值存在或者不存在,原来用 null 来表示一个值不存在,现在Optional可以更好的表达这个概念,并且可以避免空指针异常。

public class OptionalClass {

    @Test
    public void test1(){
        Optional op = Optional.of(new Employee());//注意of里面的值不能为null
        Employee e = op.get();
        System.out.println(e);
    }

    @Test
    public void test2(){
        Optional op = Optional.empty();//创建一个空的Optional实例
        System.out.println(op.get());//空Optional不能get,会报错
    }

    @Test
    public void test3(){
        Optional op = Optional.ofNullable(new Employee());//若T不为null则相当于test1,若为null,则相当于test2
        if (op.isPresent()){//判断是否为不为空, return value != null;
            System.out.println(op.get());
        }
    }

    @Test
    public void test4(){
        Optional op = Optional.ofNullable(null);//T为空,则创建一个空的Optional实例
        Employee emp = op.orElse(new Employee("lala", 21, 10000, Employee.status.VOCATION));
        //orelse,如果调用的对象有值则返回包含的值,否则返回括号的值
        System.out.println(emp);

        Employee emp2 = op.orElseGet(() -> new Employee());//supplier函数,可以在内部做逻辑处理
        System.out.println(emp2);
    }

    @Test
    public void test5(){
        Optional op = Optional.ofNullable(new Employee("lala", 21, 10000, Employee.status.VOCATION));
        Optional op2 = op.map(e -> e.getName());//如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
        System.out.println(op2.get());

        Optional op3 = op.flatMap(e -> Optional.ofNullable(e.getName()));//与map类似,要求返回值必须是Optional
        System.out.println(op3.get());
    }

}
二,ForkJoin 框架

  ForkJoin 框架 : 就是在必要的情况下,将一个大任务进行拆分(fork)成若干个小任务(拆到不可再拆分为止),然后再将一个个的小任务的运算结果进行join汇总。

//案例 : 
public class ForkJoin extends RecursiveTask {

    private long start;
    private long end;

    private static final long THRESHOLD = 100000000L;

    public ForkJoin(long start, long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        long len = end - start;
        if (len <= THRESHOLD){
            long sum = 0;
            for (long l=0; l<=end; l++){
                sum += l;
            }
            return sum;
        }else {
            long middle = (start + end)/2;
            ForkJoin leftFork = new ForkJoin(start, middle);//拆分子任务,同事压入线程池
            ForkJoin rightFork = new ForkJoin(middle+1, end);
            leftFork.fork();
            rightFork.fork();
            return leftFork.join() + rightFork.join();
        }
    }
}

//使用ForkJoin框架,在数据量特别大时比较明显
@Test
public void test1(){
    Instant start = Instant.now();//Instance与Duration都是Java1.8新增的时间工具类,java.time包下
    ForkJoinPool forkJoinPool = new ForkJoinPool();//使用ForkJoin需要ForkJoin线程池
    ForkJoinTask forkJoinTask = new ForkJoin(0, 100000000L);
    Long sum = forkJoinPool.invoke(forkJoinTask);
    System.out.println(sum);
    Instant end = Instant.now();
    System.out.println(Duration.between(start, end).toMillis());
}

@Test
public void test2(){
	Instant start = Instant.now();
	long sum = 0;
	for (long l=0; l<100000000L; l++){
	   sum += l;
	}
	Instant end = Instant.now();
	System.out.println(Duration.between(start, end).toMillis());
}
三,并行流与顺序流

  并行流与顺序流:并行流就是把一个内容分为多个数据块,并且用不同的线程分别处理每个数据块的流。
  Java8 中将并行流进行了优化,我们可以很容易的对数据进行并行 *** 作,Stream API 可以声明性地通过 parallel() 与 sequential() 在并行流与顺序流直接进行切换。

@Test
public void test3(){
    Instant start = Instant.now();
    LongStream.rangeClosed(0, 1000000000L)
            .parallel().reduce(0, Long::sum);//parallel() 声明为并行流,极大提升效率,底层运用了ForkJoin
    Instant end = Instant.now();
    System.out.println(Duration.between(start, end).toMillis());//174

	start = Instant.now();
    LongStream.rangeClosed(0, 1000000000L)
            .reduce(0, Long::sum);
    end = Instant.now();
    System.out.println(Duration.between(start, end).toMillis());//1983
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5685697.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存