美文网首页
日拱一卒:Lamdba 之 Optional 操作

日拱一卒:Lamdba 之 Optional 操作

作者: Tinyspot | 来源:发表于2023-10-16 16:02 被阅读0次

1. Optional 类

  • Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在
public final class Optional<T> {
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
}

1.1 Optional 转为 Stream 操作

@Test
public void optionalToStream() {
    List<OrderDTO> orders = Stream.of(new OrderDTO("A001", "1001", 0),
                    new OrderDTO("A002", "1002", 1),
                    new OrderDTO("A003", "1003", 1))
            .collect(Collectors.toList());

    String orderCode = Optional.ofNullable(orders)
            .orElseGet(Collections::emptyList) // .orElse(Collections.emptyList())
            .stream()
            .findFirst()
            .map(OrderDTO::getOrderCode)
            .orElse(null);
}
}
image.png

2. orElse() vs orElseGet()

public final class Optional<T> {
    public T orElse(T other) {
        return value != null ? value : other;
    }

    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }
}

2.1 示例1

@Test
public void optionalElse() {
    OrderDTO orderDTO = new OrderDTO("A001", "1001");
    String orderCode = Optional.ofNullable(orderDTO)
            .orElseGet(OrderDTO::new)
            .getOrderCode();
}

测试 null 对象

@Test
public void optionalElseDemo() {
    System.out.println(optionalElseDemo(new OrderDTO("A001", "1001")));
    System.out.println(optionalElseDemo(null));
}

public String optionalElseDemo(OrderDTO orderDTO) {
    // return Optional.ofNullable(orderDTO)
    //         .orElse(new OrderDTO())
    //         .getOrderCode();

    return Optional.ofNullable(orderDTO)
            .orElseGet(OrderDTO::new)
            .getOrderCode();
}

2.2 示例2

@Test
public void optionalElseGet() {
    System.out.println(optionalElse(new OrderDTO("A001", "1001")));
    System.out.println(optionalElse(null));
    System.out.println("############");
    System.out.println(optionalElseGet(new OrderDTO("A001", "1001")));
    System.out.println(optionalElseGet(null));
}
/**
 * orElse(): 不管 orderDTO 是否为null,newInstance()都会执行
 */
public String optionalElse(OrderDTO orderDTO) {
    return Optional.ofNullable(orderDTO)
            .orElse(newInstance())
            .getOrderCode();
}

/**
 *  orElseGet(Supplier)是orElse方法的延迟调用版
 *      Supplier方法只有在Optional对象不含值时才执行调用
 */
public String optionalElseGet(OrderDTO orderDTO) {
    // orElseGet() 只在 orderDTO 为 null 时,newInstance() 才会执行
    return Optional.ofNullable(orderDTO)
            .orElseGet(this::newInstance)
            .getOrderCode();
}

打印结果

....
A001
....
null
############
A001
....
null

3. map()

@Test
public void optionalMap() {
    List<OrderDTO> orders = Stream.of(new OrderDTO("A001", "1001", 0),
                    new OrderDTO("A002", "1002", 1),
                    new OrderDTO("A003", "1003", 1))
            .collect(Collectors.toList());

    String orderCode = Optional.ofNullable(orders)
            .map(list -> list.stream().findFirst().orElse(new OrderDTO()))
            .map(OrderDTO::getOrderCode)
            .orElse(null);
}

Optional.map() 源码

public final class Optional<T> {
    public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }
}

4. ifPresent(Consumer)

  • isPresent()将在Optional包含值的时候返回true,否则返回false
  • ifPresent(Consumer<T> block)会在值存在的时候执行给定的代码块
public final class Optional<T> {
    public boolean isPresent() {
        return value != null;
    }

    public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }
}

4.1 示例

@Test
public void present() {
    List<OrderDTO> orders = Stream.of(new OrderDTO("A001", "1001", 0),
                    new OrderDTO("A002", "1002", 1),
                    new OrderDTO("A003", "1003", 1))
            .collect(Collectors.toList());

    boolean isPresent = Optional.ofNullable(orders).isPresent();

    Optional.ofNullable(orders).ifPresent(list -> list.forEach(System.out::println));
}

4.2 示例

@Test
public void ifPresent() {
    OrderVO orderVO = new OrderVO("A001", "");
    Map<String, String> featureMap = new HashMap<>();
    featureMap.put("key", "value1");
    orderVO.setFeatureMap(featureMap);
    OrderDTO orderDTO = new OrderDTO();

    fillOrder(orderVO, orderDTO);
    System.out.println(orderDTO);
}

public void fillOrder(OrderVO orderVO, OrderDTO orderDTO) {
    Optional.ofNullable(orderVO)
            .map(OrderVO::getTradeId)
            .ifPresent(orderDTO::setTradeId);

    Optional.ofNullable(orderVO)
            .map(o -> o.getFeature("key"))
            .filter(StringUtils::isNotEmpty)
            .ifPresent(str -> orderDTO.addFeature("key", orderVO.getFeature("key")));
}

相关文章

  • 日拱一卒英语社群复盘ing

    相 信 我,你 并 不 孤 独。 日拱一卒启动仪式1-4合集 日拱一卒”英语社群入群作业 日拱一卒启动仪式1-4合...

  • 日拱一卒

    日拱一卒是一个成语,完整的表述是:日拱一卒,功不唐捐。源于《法华经》 :“日拱一卒无尽有,功不唐捐终入海”。 会下...

  • 2017-10-11

    持之以恒,日拱一卒。

  • 2017-10-11

    持之以恒,日拱一卒。

  • 今晚,信仰

    如题,日拱一卒

  • 感觉要重新开始写作了

    按兴趣日拱一卒

  • 坚持还是放弃?取舍之间彰显大智慧。

    今天看到一段话,感觉写的更好,分享给大家。“日拱一卒”源于《法华经》:日拱一卒,功不唐捐——日拱一卒无有尽,功不唐...

  • 2021-04-25

    冰冻三尺,非一日之寒。 日拱一卒,功不唐捐。

  • 日拱一卒

    日拱一卒 任务0(12月11日) 最近刚加入这个“日拱一卒”的社群,名字非常好,学英文就...

  • 无题

    日拱一卒,功不唐捐。

网友评论

      本文标题:日拱一卒:Lamdba 之 Optional 操作

      本文链接:https://www.haomeiwen.com/subject/kioxidtx.html