《Java核心技术II》管道化Optional值

管道化Optional值

map来转换Optional内部的值

Optional transformed = optionalString.map(String::toUpperCase);
将结果添加到列表中,如果存在则添加,为空则什么也不会发生
optionalValue.map(result::add);

类似的使用filter方法来进行过滤

Optional transformed = optionalString.filter(s->s.length()>=8).map(String::toUpperCase)

用or将Option替换为另一个,替换值将以惰性方式计算

Optional result = optionalString.or(()->alternatives.stream().findFirst());

管道化Optional案例
java 复制代码
package streams.optional;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.logging.Logger;

public class OptionalMapFilterOr {

    public static void main(String[] args) throws IOException {
        // Path相对路径是指JavaCore2
        var contents = Files.readString(Path.of("./resources/alice.txt"));
        List<String> words = List.of(contents.split("\\PL+"));
        List results = new ArrayList<String>();
        // map
        Optional<String> startsWithQ = words.stream().filter(s -> s.startsWith("Q")).findFirst();
        Optional<String> transformed = startsWithQ.map(String::toUpperCase);
        System.out.println("transformed:"+transformed.orElse(""));
        //filter
        Optional<String> filter = startsWithQ.filter(s -> s.length()>=8).map(String::toUpperCase);
        System.out.println("filter:"+filter);
        //or
        Optional<String> result = startsWithQ.filter(s -> s.length()>=8).or(()->words.stream().max(String::compareTo));
        System.out.println("result:"+result.orElse(""));
    }

}
不适合使用Optional值的方法
Optional类型正确用法
  • Optional类型变量永远不应该为null
  • 不要使用Optional类型的域(字段)
  • Optional方法参数有问题,要求值必须存在,应该编写两个重载版本。
  • 不要在集合中放置Optional对象,也不要作为map的键,应该直接收集其中的值。
    关注get,orElseThrow,isEmpty,isPresent方法。
相关推荐
Ivanqhz20 分钟前
Rust &‘static str浅析
java·前端·javascript·rust
威联通网络存储36 分钟前
TS-h2490FU在面板制造Array段AOI缺陷画廊中的并联
python·制造
Wang's Blog1 小时前
Go-Zero项目开发24: 基于Bitmap实现群聊消息已读未读
开发语言·后端·golang
接针1 小时前
UV 常用命令
python·uv
无垠的广袤3 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
weixin_419658313 小时前
Docker 搭建 Jenkins 服务
java·docker·jenkins
Yolanda_20223 小时前
在vscode终端中可使用pip,但是cmd终端中找不到命令 pip问题的解决
vscode·python·conda·pip
2301_764441334 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
captain3764 小时前
多线程线程安全问题
java·java-ee
吃好睡好便好4 小时前
MATLAB中图像的读取、写入和显示
开发语言·图像处理·学习·计算机视觉·matlab