Java8 的 其他新特性

Optional 类

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

常用方法:

  • Optional.of(T t) : 创建一个 Optional 实例
  • Optional.empty() : 创建一个空的 Optional 实例
  • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
  • isPresent() : 判断是否包含值
  • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
  • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
  • flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

重复注解与类型注解

Java 8对注解处理提供了两点改进:可重复的注解可用于类型的注解

image.png

代码演示

####### Goddess

package com.www.java8.optional;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 邮箱: 483223455@qq.com
 * <p>
 * 创建时间: 2022/8/15  17:28  星期一
 * <p>
 */
public class Goddess {
    private String name;
    
    public Goddess() {
    
    }
    
    public Goddess(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "Goddess{" +
                "name='" + name + '\'' +
                '}';
    }
}


####### Man

package com.www.java8.optional;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 邮箱: 483223455@qq.com
 * <p>
 * 创建时间: 2022/8/15  17:28  星期一
 * <p>
 */
public class Man {
    private Goddess goddess;
    
    public Man(Goddess goddess) {
        this.goddess = goddess;
    }
    
    public Man() {
    }
    
    public Goddess getGoddess() {
        return goddess;
    }
    
    public void setGoddess(Goddess goddess) {
        this.goddess = goddess;
    }
    
    @Override
    public String toString() {
        return "Man{" +
                "goddess=" + goddess +
                '}';
    }
}

NewMan

package com.www.java8.optional;

import java.util.Optional;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 邮箱: 483223455@qq.com
 * <p>
 * 创建时间: 2022/8/15  17:35  星期一
 * <p>
 */
public class NewMan {
    private Optional<Goddess> goddess= Optional.empty();
    
    public NewMan(Optional<Goddess> goddess) {
        this.goddess = goddess;
    }
    
    public NewMan() {
    }
    
    
    public Optional<Goddess> getGoddess() {
        return goddess;
    }
    
    public void setGoddess(Optional<Goddess> goddess) {
        this.goddess = goddess;
    }
    
    @Override
    public String toString() {
        return "NewMan{" +
                "goddess=" + goddess +
                '}';
    }
}

####### OptionalTest

package com.www.java8.optional;

import com.www.java8.entity.Employee;
import org.junit.Test;

import java.util.Optional;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 邮箱: 483223455@qq.com
 * <p>
 * 创建时间: 2022/8/15  17:09  星期一
 * <p>
 */
public class OptionalTest {
    /**
     * Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
     * <p>
     * <p>
     * <p>
     * <p>
     * <p>
     * 常用方法:
     * <p>
     * <p>
     * Optional.of(T t) : 创建一个 Optional 实例
     * <p>
     * Optional.empty() : 创建一个空的 Optional 实例
     * <p>
     * Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
     * <p>
     * isPresent() : 判断是否包含值
     * <p>
     * orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
     * <p>
     * orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
     * <p>
     * map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
     * <p>
     * flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
     */
    @Test
    public void test() {
        Optional<Employee> employee = Optional.of(new Employee());
        //        Optional<Employee> employee = Optional.of(null);
        Employee employee1 = employee.get();
        System.out.println(employee1);
        
    }
    
    /**
     * 创建一个空的 Optional
     */
    @Test
    public void test1() {
        Optional<Object> empty = Optional.empty();
        System.out.println("empty.get() = " + empty.get());
    }
    
    /**
     *
     */
    @Test
    public void test2() {
        Optional<Employee> employee = Optional.ofNullable(null);
        if (employee.isPresent()) {
            System.out.println("employee.get() = " + employee.get());
        }
        
        Employee employee1 = employee.orElse(new Employee("12", 12, 21.3, Employee.Status.FREE));
        System.out.println(employee1);
        
        Employee employee2 = employee.orElseGet(() -> new Employee());
        System.out.println(employee2);
    }
    
    /**
     *
     */
    @Test
    public void test3() {
        Optional<Employee> employee = Optional.ofNullable(new Employee("12", 12, 21.3, Employee.Status.FREE));
        Optional<String> s = employee.map(Employee::getName);
        System.out.println(s.get());
        Optional<String> s1 = employee.flatMap(e -> Optional.ofNullable(e.getName()));
        System.out.println("s1 = " + s1.get());
        
    }
    
    /**
     *
     */
    @Test
    public void test4() {
        //        Man man = new Man();
        ////        //        String goddessName = getGoddessName(man);
        //        System.out.println(goddessName);
        Optional<Goddess> gn = Optional.ofNullable(null);
        Optional<NewMan> newMan = Optional.ofNullable(new NewMan(gn));
        String goddessNewMan = getGoddessNewMan(newMan);
        System.out.println("goddessNewMan = " + goddessNewMan);
    }
    
    /**
     * 获取 Goddess 的名字
     *
     * @param man
     * @return
     */
    private String getGoddessName(Man man) {
        return man.getGoddess().getName();
    }
    
    
    private String getGoddessNewMan(Optional<NewMan> newMan) {
        return newMan.orElse(new NewMan())
                .getGoddess()
                .orElse(new Goddess("w"))
                .getName();
    }
    
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • java8新特性 原创者:文思 一、特性简介 速度更快 代码更少,增加了Lambda 强大的Stream API ...
    文思li阅读 3,066评论 1 1
  • 一、Lambda表达式 Lambda表达式引入了一个新的操作符" -> "。Lambda表达式将函数当成参数传递给...
    逝去丶浅秋阅读 589评论 0 1
  • 为什么使用 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传...
    强某某阅读 14,839评论 0 15
  • 一、重要数据结构和JVM的改动 1.HashMap的改动 HashMap维护了一个Entry数组,put(K ke...
    一只爱java的猫阅读 494评论 0 0
  • 1.Lamda表达式 Lambda表达式的作用主要是用来简化接口的创建,使用Lambda表达式接口必须是函数式接口...
    影风扬阅读 381评论 0 0