个人学习

第七章Lambda表达式和Stream流

2020-03-11  本文已影响0人  后来丶_a24d

目录


lambda表达式和Straem流

方法引用优于lambda表达式

优先使用标准的函数式接口

  1. 由于Lambda的存在,通过子类重写基本方法以专门化超类的行为的方式有点过时。
  2. 替代方案:提供一个静态工厂或者构造器,它们接收一个函数对象来实现相同的效果。
  3. 一般来说,我们将编写更多以函数对象作为参数的构造函数和方法。
// 模板方法
abstract class A {
    public void print() {
        System.out.println("A");
        doSubThing();
    }

    abstract void doSubThing();
}

class B extends A {
    @Override
    void doSubThing() {
        System.out.println("B");
    }
}

// lambda
class A {
    private Supplier<String> supplier;

    public A(Supplier<String> supplier) {
        this.supplier = supplier;
    }

    public void print() {
        System.out.println("A");
        System.out.println(supplier.get());
    }
}

public static void main(String[] args) {
    A a = new A(() -> "B");
    a.print();
}

明智审慎地使用Stream

优先选择流中无副作用的功能

优先选择集合作为返回值

谨慎使用并行流

// 串行,10^8需要30秒
static long pi(long n) {
    return LongStream.rangeClosed(2, n)
        .mapToObj(BigInteger::valueOf)
        .filter(i -> i.isProbablePrime(50))
        .count();
}

// 并行,10^8需要9秒
static long pi(long n) {
    return LongStream.rangeClosed(2, n)
    .parallel()
    .mapToObj(BigInteger::valueOf)
    .filter(i -> i.isProbablePrime(50))
    .count();
}

//改变
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
end.setYear(78);

参考文章

上一篇 下一篇

猜你喜欢

热点阅读