java+private接口null_Java8之妙用Optional解决判断Null为空的问题

先来铺垫下已经存在的 Java8 定义的函数式接口:

我们基本不需要定义自己的函数式接口,Java8 已经给我们提供了大量的默认函数式接口,基本够用,在 rt.jar 包的 java.util.function 目录下可以看到所有默认的函数式接口,大致分为几类:

Function T 作为输入,返回的 R 作为输出

Predicate T 作为输入 ,返回 boolean 值的输出

Consumer T 作为输入 ,没有输出

Supplier 没有输入 , R 作为输出

BinaryOperator 两个 T 作为输入 ,T 同样是输出

UnaryOperator 是 Function 的变种 ,输入输出者是 T

我们先来看看示例:

其它的都是上面几种的各种扩展,只为更方便的使用,下面演示示例,你可以把其当成正常的接口使用,由用户使用 Lambda 传入。

// hello world 示例

Function function = (x) -> {return x+"Function";};

System.out.println(function.apply("hello world")); // hello world Function

UnaryOperator unaryOperator = x -> x + 2;

System.out.println(unaryOperator.apply("9420-")); // 9420-2

// 判断输入值是否为偶数示例

Predicate predicate = (x) ->{return x % 2 == 0 ;};

System.out.println(predicate.test(1)); // false

// 这个没有返回值

Consumer consumer = (x) -> {System.out.println(x);};

consumer.accept("hello world "); // hello world

// 这个没有输入

Supplier supplier = () -> {return "Supplier";};

System.out.println(supplier.get()); // Supplier

// 找出大数

BinaryOperator bina = (x, y) ->{return x > y ? x : y;};

bina.apply(1,2); // 2

接下来我们进入本文要讲解的内容:

let's go ~

if(user!=null){

Address address = user.getAddress();

if(address!=null){

String province = address.getProvince();

}

}

这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明:

实战:

使用最多:

972804ce294a3f65aecac8bca0844a46.png

939ee0c779a65c6c5263da2bc03bd45b.png

1a60dbafb02165a9bb8dc4a74463b8d0.png

API介绍

1、Optional(T value),empty(),of(T value),ofNullable(T value)

这四个函数之间具有相关性,因此放在一组进行记忆。

先说明一下,Optional(T value),即构造函数,它是private权限的,不能由外部调用的。其余三个函数是public权限,供我们所调用。那么,Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空。好吧,这么说还是比较抽象。直接上Optional(T value)构造函数的源码,如下图所示

003db51180e048364a1c20f338468cf3.png

2、orElse(T other),orElseGet(Supplier extends T> other)和orElseThrow(Supplier extends X> exceptionSupplier)

这三个函数放一组进行记忆,都是在构造函数传入的value值为null时,进行调用的。orElse和orElseGet的用法如下所示,相当于value值为null时,给予一个默认值:

@Test

public void test() {

User user = null;

user = Optional.ofNullable(user).orElse(createUser());

user = Optional.ofNullable(user).orElseGet(() -> createUser());

Object orElseGet = Optional.ofNullable(inss).orElseGet(()-> "sssssss");

}

public User createUser(){

User user = new User();

user.setName("zhangsan");

return user;

}

3754d2e71e04ce7ebb46bef2e2076029.png

3e240a065a5a7a610a0ed21716fb7e52.png

82b913dc2c9d9696755a6976b03d7235.png

判断list里的元素:

public static voidmain(String[] args) {

Address a1= new Address("成都");

Address a2= new Address("南京");

Address a3= new Address("天津");

Address a4= new Address("北京");

List

list = new ArrayList<>();

List

list1 = new ArrayList<>();

list.add(a1);list.add(a2);list.add(a3);list.add(a4);

List

collect = list.stream().filter(a->Optional.ofNullable(a).map(address-> address.getCity().contains("京")).get()

)

.peek(a->{

a.setCity(a.getCity().replace("京","精"));

list1.add(a);

})

.collect(Collectors.toList());

System.out.println(collect);

System.out.println(list1);

}

结果:

[Address{city='南精'}, Address{city='北精'}]

[Address{city='南精'}, Address{city='北精'}]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值