当前位置: 首页 > article >正文

《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案例
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方法。

http://www.kler.cn/a/466634.html

相关文章:

  • 【USRP】教程:在Macos M1(Apple芯片)上安装UHD驱动(最正确的安装方法)
  • vite6+vue3+ts+prettier+eslint9配置前端项目(后台管理系统、移动端H5项目通用配置)
  • 【MATLAB】【Simulink仿真】向模型中添加自定义子系统
  • 123.【C语言】数据结构之快速排序挖坑法和前后指针法
  • Spring SpEL表达式由浅入深
  • 集合划分.
  • Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
  • 涡度通量/数据质量控制/数据缺失插补/数据组分拆分/数据可视化分析/气象数据/光敏感性分析/温度敏感性分析/数据风浪区分析
  • 简单使用linux
  • 【Qt】Qt中使用三角函数
  • 《机器学习》——逻辑回归(下采样)
  • LeetCode:513.找二叉树左下角的
  • 日志聚类算法 Drain 的实践与改良
  • SQL Sever 数据库损坏,只有.mdf文件,如何恢复?
  • 模块化通讯管理机在物联网系统中的应用
  • Apache Celeborn 在B站的生产实践
  • 微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域
  • 通俗易懂的讲一下Vue的双向绑定和React的单向绑定
  • 大模型训练底座-多集群管理
  • python28-IO编程、文件读写、os模块
  • [商业化] 【微软商店】如何申请ITIN、修改Manifest并处理Win32应用的FullTrust权限
  • 区块链安全常见的攻击分析——拒绝服务攻击 (Denial of Service-DOS)King合约【11】
  • ROS导航使用贝塞尔曲线对全局路径进行平滑处理
  • 一份完整的软件测试报告如何编写?
  • 拆解 Web3:探寻去中心化网络的核心密码
  • RK3588+麒麟国产系统+FPGA+AI在电力和轨道交通视觉与采集系统的应用