httpClient 远程调用接口,java8新特性Optional

import java.util.Optional;

/**
 * java 8新特性
 *
 * @author wang-xiaoming
 * @date 2019年7月2日
 */
public class OptionalTest {

    public static void ofNullable(String value) {
        Optional<String> opt = Optional.ofNullable(value);
        System.out.println("【ofNullable】,value:" + opt.get());
    }

    public static void of(String value) {
        Optional<String> opt = Optional.of(value);
        System.out.println("【of】,value:" + opt.get());
    }

    /**
     * 有值则返回值,没有则返回【指定属性】
     *
     * @param value
     */
    public static void orElse(String value) {
        String orElse = Optional.ofNullable(value).orElse("default");
        System.out.println("【orElse】,value:" + orElse);
    }

    /**
     * 有值则返回值,没有则执行‘->’后的【执行方法】
     *
     * @param value
     */
    public static void orElseGet(String value) {
        String orElseGet = Optional.ofNullable(value).orElseGet(() -> "default");
        System.out.println("【orElseGet】,value:" + orElseGet);
    }

    /**
     * 判断当前value是否为null,为null,返回false;不为null,返回true
     *
     * @param value
     */
    public static void isPresent(String value) {
        boolean present = Optional.ofNullable(value).isPresent();
        System.out.println("【isPresent】,result:" + present);
    }

    /**
     * ep:当抛出NPE时,可以自己指定异常
     *
     * @param value
     */
    public static void orElseThrow(String value) {
        String orElseThrow = Optional.ofNullable(value).orElseThrow(() -> new IllegalArgumentException());
        System.out.println("【orElseThrow】,exception:" + orElseThrow);
    }

    /**
     * 转换值-map map() 对值应用(调用)作为参数的函数,然后将返回的值包装在 Optional 中。这就使对返回值进行链试调用的操作成为可能
     *
     * @param user
     */
    public static void map(User user) {
        String map = Optional.ofNullable(user).map(u -> u.getName()).orElse("转换值-map");
        System.out.println("【map】,result:" + map);
    }

    /**
     * 转换值-flatMap 既然 getter 方法返回 String 值的 Optional,你可以在对 User 的 Optional 对象调用 flatMap() 时,用它作为参数
     *
     * @param user
     */
    public static void flatMap(User user) {
        String flatMap = Optional.ofNullable(user).flatMap(u -> u.getHobby()).orElse("转换值-flatMap");
        System.out.println("【flatMap】,result:" + flatMap);
    }

    /**
     * 添加过滤
     *
     * @param user
     */
    public static void filter(User user) {
        boolean filter =
            Optional.ofNullable(user).filter(u -> u.getName() != null && u.getName().contains("m")).isPresent();
        System.out.println("【filter】,result:" + filter);
    }

    /**
     * 简化if...else...?
     *
     * @param user
     * @param type
     */
    public static void doCheck(User user, int type) {
        String countryName = "";
        if (type == 0) {
            countryName = Optional.ofNullable(user).flatMap(u -> u.getAddress()).flatMap(u -> u.getCountry())
                .map(c -> c.getName()).orElse("濮阳");
        } else if (type == 1) {
            countryName = Optional.ofNullable(user).flatMap(User::getAddress).flatMap(Address::getCountry)
                .map(Country::getName).orElse("濮阳");
        }
        System.out.println("【doCheck】,result:" + countryName);
    }

    public static final String value = null;
    public static final User user0 = new User();

    public static void main(String[] args) {
        // of(null);// Exception in thread "main" java.lang.NullPointerException
        // ofNullable(null);// Exception in thread "main" java.util.NoSuchElementException: No value present

        // orElse(null);// 【orElse】,value:default
        // orElseGet(null);// 【orElseGet】,value:default

        // isPresent(null);// 【isPresent】,result:false
        // orElseThrow(null);// Exception in thread "main" java.lang.IllegalArgumentException

        // map(new User(6, null, "篮球-basketball"));// 【map】,result:转换值-map
        // flatMap(new User(6, "xm", null));// 【flatMap】,result:转换值-flatMap

        // filter(new User(6, "xx", "篮球-basketball"));// 【filter】,result:false

        // 正常情况下,拿出用户城市名称
        /*if (user != null) {
            Address address = user.getAddress();
            if (address != null) {
                Country country = address.getCountry();
                if (country != null) {
                    String isocode = country.getIsocode();
                    if (isocode != null) {
                        isocode = isocode.toUpperCase();
                    }
                }
            }
        }*/
        doCheck(new User(6, "xx", "篮球-basketball"), 0);// 【doCheck】,result:濮阳s
        doCheck(new User(6, "xx", "篮球-basketball"), 1);// 【doCheck】,result:濮阳s

    }
}

/**
 * 用户
 *
 * @author wang-xiaoming
 * @date 2019年7月1日
 */
class User {
    private Integer sno;
    private String name;
    private String hobby;
    private Address address;

    public Integer getSno() {
        return sno;
    }

    public void setSno(Integer sno) {
        this.sno = sno;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Optional<String> getHobby() {
        return Optional.ofNullable(hobby);
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public Optional<Address> getAddress() {
        return Optional.ofNullable(address);
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public User(Integer sno, String name, String hobby) {
        super();
        this.sno = sno;
        this.name = name;
        this.hobby = hobby;
    }

    public User() {
        super();
    }

}

/**
 * 地址
 *
 * @author wang-xiaoming
 * @date 2019年7月1日
 */
class Address {
    private Country country;

    public Optional<Country> getCountry() {
        return Optional.ofNullable(country);
    }

    public void setCountry(Country country) {
        this.country = country;
    }

}

/**
 * 城市
 *
 * @author wang-xiaoming
 * @date 2019年7月1日
 */
class Country {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

虽然参考网上有查到一些示例,但是感觉用到的地方有限,就上段代码中备注掉的传统非空判断,其实没有必要将每个对象取出,直接判断也行,不过为了代码简洁,新特性需要多加借鉴。

下面的这个例子倒是有让人眼前一亮的感觉,如有更多渐变代码编程实例,欢迎留言!

// 求出集合中小于4的个数
// int[] arr = {0, 2, 5, 8, -6};
Integer[] arr = {null, 2, 5, 8, -6};
List<Integer> list = Arrays.asList(arr);
System.out.println(list.stream().filter(rand -> rand != null && rand < 4).count());

套用公司的一句话:我们的目标是简单、直接地解决问题,任何复杂的套路都是耍流氓!

原文地址:https://www.cnblogs.com/huakaiyoushi/p/11121934.html

时间: 2024-11-09 14:27:42

httpClient 远程调用接口,java8新特性Optional的相关文章

Java8 新特性 Optional 类

Optional 类的简介 ??Optional类的是来自谷歌Guava的启发,然后就加入到Java8新特性中去了.Optional类主要就是为子决解价值亿万的错误,空指针异常. ??Optional类其实就是一个可选值的包装类,说明这个类即可以有空值,也可以有对象. Optional 简单使用 ??这个类也会报空指针异常:of(),empty() @Test public void OptionalTest() { //报:NullPointerException //of()方法,是在传入n

Java8新特性--Optional

Java 8引入了一个新的Optional类.Optional类的Javadoc描述如下: 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. 本文会逐个探讨Optional类包含的方法,并通过一两个示例展示如何使用. of 为非null的值创建一个Optional. of方法通过工厂方法创建Optional类.需要注意的是,创建对象时传入的参数不能为null.如果传入参数为null,则抛出NullPointerExcepti

java8 新特性 Optional容器类

public class Godness { private String name; public Godness() { } public Godness(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { re

Java8新特性 - Optional容器类

Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念.并且可以避免空指针异常. Optional.of(T t) : 创建一个Optional 实例 Optional.empty() : 创建一个空的Optional 实例 Optional.ofNullable(T t):若t 不为null,创建Optional 实例,否则创建空实例 isPresent() : 判断是否

Java8 新特性之流式数据处理

一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现. 比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现: List<Integer> evens = new ArrayList<>(); for (final Integer num : nums) { if (num % 2 =

乐字节-Java8新特性-接口默认方法之Stream流(下)

接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 筛选和切片 filter(T -> boolean):保留 boolean 为 true 的元素 limit(long n):返回前 n 个元素 skip(long n):去除前 n 个元素 distinct():去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的 映射 map

乐字节-Java8新特性之Optional

上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 1.of 为非null的值创建一个Optional,如果值为null,则会抛出NullPointerException Optional<Integer> optional =

JAVA8新特性——接口定义增强

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 接口定义增强 在JDK1.8以前,接口是定义的: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 在JDK1.8之前,接口有如下特性: 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错). 接口中

Java8 新特性----函数式接口,以及和Lambda表达式的关系

这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系说明清楚,在这里,把自己的理解整理如下: 一.函数式接口: 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口(Single Abstract Method).定义了这种类型的接口,使得以其为参数的方法,可以在调用时,使用一个lambda表达式作为参数.从另一个方面说,一旦我