Java8阅读笔记

jonathan
2017-03-12 / 0 评论

懂得什么是行为参数化

http://www.tuicool.com/articles/yIv2Mjy

对比:

通过IntelliJ IDEA 2016.3 来更好使用Java 8的Stream API

5e212be2-8394-490a-a8f1-3a27f0b386f3

c20cdfb2-cdf8-4667-96a4-4a1577005684

0504e701-915f-4f14-8498-5f668a25cdab

归约

使用归约方法的有事和并行化:

相比于前面写的逐步迭代求和,使用reduce的好处在于,这里的迭代被内部迭代抽象掉了,这让内部实现得以选择并行执行reduce操作。而迭代式求和例子要更新共享变量sum,这不是那么容易并行化的。如果你加入了同步,很可能会发现线程竞争抵消了并行本应带来的性能提升!

java8 策略模式重构:P192

例子:对输入的内容进行验证或者格式化(比如只包含小写字母或者数字)。

// 此接口实际是一个函数接口

public interface ValidationStrategy {
    boolean execute(String s);
}

// 两个实现类

public class IsAllLowerCase implements ValidationStrategy {
    public boolean execute(String s) {
        return s.matches("[a-z] +");
    }
}
public class IsNumeric implements ValidationStrategy {
    public boolean execute(String s) {
        return s.matches("\\d+"");
    }
}

/ / 定义一个类去使用

public class Validator{
    private final ValidationStrategy strategy;
    public Validator(ValidationStrategy v){
        this.strategy = v;
    }
    public boolean validate(String s){
        return strategy.execute(s);
    }
}

// 实际业务中使用

Validator numericValidateor = new Validator(new IsNumeric());
boolean b1 = numericValidator.validate("aaaa");
Validator lowerCaseValidator = new Validator(new IsAllLowerCase());
boolean b2 = lowerCaseValidator.validate("bbbb");

使用Lambda表达式:

不需要编写两个实现类直接使用Lambda表达式:

Validator numericValidator = new Validator((String s) -> s.matches("[a-z]+"));
boolean b1 = numericValidaor.validate("aaaa");
Validator lowerCaseValidator = new Validator((String s) -> s.matches("\\d+"));
boolean b2 = lowerCaseValidator.validate("bbbb");

引入Optional类的意图并非消除每一个null引用。

创建Optional对象

1.声明一个空的Optional

Optional<Car> optCar = Optional.empty();

2.依据一个非空值创建Optional

Optional<Car> optCar = Optional.of(car);// 如果car是一个null,这段代码会立即抛出一个NullPointerException,而不是你访问car属性值时才返回一个错误。

3.可接受null的Optional

Optional<Car> optCar = Optional.ofNullable(car);

如果car是null,那么得到的Optional对象就是个空对象。

两层Optional嵌套必须使用flatMap

4c8e3674-8d22-4585-9a88-f16699a0d26e

如果你引用第三方库是需要序列化的,使用Optional可能会出错。

32bd5c3d-9d87-4515-a5f7-e5bff42483b9

如果您返回的的是OptionalInt(基础类型)类型的对象,你就不能将其作为方法引用传递给另一个Optional对象的flatMap方法

dcd19030-dfd8-41b2-86ac-20d347907a22

8a811e54-4d41-4d5a-88b7-0ce76e9ea38e

0b34bec9-cd6d-4bef-a0ed-5271a2ec3146

0a2eb7f9-deee-4367-af40-2acef9834d3d

43580ecb-deca-444d-a495-b17e80520b79

8a8aca4a-ca3c-4def-8e99-9657824125e6

评论

博主关闭了当前页面的评论