2026/4/17 7:01:32
网站建设
项目流程
常用的电子商务网站开发技术,门户网站建设和运行保证的磋商文件,网站配色方案橙色,淘客怎么做自己的网站OptionalT 是一个容器类#xff0c;用于表示一个值可能存在也可能不存在#xff08;但若存在#xff0c;则一定非 null#xff09;。 如果值存在#xff0c;isPresent() 返回 true#xff0c;get() 可获取该值#xff1b; 同时还提供了一系列安全处理值存在与否…OptionalT是一个容器类用于表示一个值可能存在也可能不存在但若存在则一定非 null。如果值存在isPresent()返回trueget()可获取该值同时还提供了一系列安全处理值存在与否的链式方法如ifPresent()值存在时执行操作orElse()/orElseGet()值不存在时提供默认值map()/filter()对值进行转换或过滤Optional是一个基于值的类value-based class不应使用、hashCode()用于身份识别或同步操作否则可能导致不可预测的行为 理解java的值传递本质。 它主要用于方法返回值以更清晰、安全地表达“可能无结果”的语义避免显式 null 检查。1.字段private static final Optional? EMPTYprivate static final Optional? EMPTY new Optional();作用一个共享的、空的Optional实例。类型Optional?表示“未知类型的空 Optional”。用途作为所有empty()调用的底层单例节省内存。注意它是private的外部不能直接访问。2.字段private final T valueprivate final T value;作用存储实际的值。语义若value ! null→ 有值present若value null→ 无值empty不可变性final保证Optional是不可变对象符合 value-based 类设计。3.私有构造函数private Optional()private Optional() { this.value null; }作用创建一个空的Optional仅用于初始化EMPTY。不可外部调用因为是private。4.静态方法public static T OptionalT empty()public static T OptionalT empty() { SuppressWarnings(unchecked) OptionalT t (OptionalT) EMPTY; return t; }作用返回一个类型安全的空 Optional。实现强制将EMPTY转为OptionalT利用泛型擦除运行时安全。使用建议永远不要用 Optional.empty()判断是否为空应使用isPresent()。5.私有构造函数private Optional(T value)private Optional(T value) { this.value Objects.requireNonNull(value); }作用创建一个包含非 null 值的Optional。校验若传入null抛出NullPointerException。仅内部使用由of()调用。6.静态方法public static T OptionalT of(T value)public static T OptionalT of(T value)作用创建一个包含非 null 值的Optional。异常若value null抛出NullPointerException。适用场景确定值不为 null时使用。7.静态方法public static T OptionalT ofNullable(T value)public static T OptionalT ofNullable(T value) { return value null ? empty() : of(value); }作用安全地包装可能为 null 的值。逻辑若value ! null→return of(value)若value null→return empty()最常用的创建方式用于处理不确定是否为 null 的值。8.实例方法public T get()public T get() { if (value null) { throw new NoSuchElementException(No value present); } return value; }作用获取值。风险若无值value null抛出NoSuchElementException。建议避免直接使用除非你 100% 确定有值。优先使用orElse()、ifPresent()等。OptionalU uOptional list.stream() .filter(item - UEnum.XX.getCode().equals(item.getName())) .findFirst(); if (!uOptional.isPresent()) { return null; } U res uOptional.get(); return res.getName();9.实例方法public boolean isPresent()public boolean isPresent() { return value ! null; }作用判断是否有值。返回true→value ! nullfalse→value null用途可用于条件判断但更推荐函数式风格如ifPresent。10.实例方法public void ifPresent(Consumer? super T consumer)public void ifPresent(Consumer? super T consumer) { if (value ! null) consumer.accept(value); }作用如果有值执行consumer.accept(value)否则什么都不做。优点避免显式 if 判断代码更简洁。示例MapString, ListLong map Maps.newHashMap(); Optional.ofNullable(types).ifPresent(list - map.put(DictAlias.TYPE.getCode(), list)); #使用的是 Optional 类的710两个方法11.实例方法public OptionalT filter(Predicate? super T predicate)public OptionalT filter(Predicate? super T predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); }作用对值进行条件过滤。逻辑无值 → 返回this即empty()有值且predicate.test(value) true→ 返回this有值但不满足条件 → 返回empty()用途链式过滤。示例OptionalString s Optional.of(hello); s.filter(x - x.length() 10); // empty12.实例方法public U OptionalU map(Function? super T, ? extends U mapper)publicU OptionalU map(Function? super T, ? extends U mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } }作用对值进行转换并自动处理 null。逻辑无值 → 返回empty()有值 → 调用mapper.apply(value)然后用ofNullable()包装结果关键点如果mapper返回null结果是empty()不会抛 NPE。用途链式转换如从OptionalUser到OptionalString。map的核心价值空安全Optional 为空时跳过转换。null 安全转换结果为 null 时自动变为空 Optional。链式编程支持流畅的.map().filter().map()风格。避免样板代码无需手动写if (x ! null)。示例# 1.Optional 有值且 mapper 返回非 null OptionalUser userOpt Optional.of(new User(alice)); OptionalString upperName userOpt.map(User::getName) //Optional[alice] .map(String::toUpperCase); // Optional[ALICE] System.out.println(upperName); // Optional[ALICE] # 2.Optional 有值但 mapper 返回 null OptionalString opt Optional.of(hello); // 假设有一个函数可能返回 null OptionalString result opt.map(s - s.equals(world) ? OK : null); System.out.println(result); // Optional.empty # 3.Optional 本身为空 mapper 根本不会被执行 OptionalUser emptyUser Optional.empty(); OptionalString name emptyUser.map(User::getName); // 不会调用 getName() System.out.println(name); // Optional.empty// 传统方式需要多层 null 检查 User user getUser(); // 可能返回 null String upperName null; if (user ! null) { String name user.getName(); // getName() 可能返回 null if (name ! null) { upperName name.toUpperCase(); } } // 最终 upperName 还可能是 null VS 用 Optional.map() OptionalString upperName Optional.ofNullable(getUser()) .map(User::getName) .map(String::toUpperCase); // 自动处理所有 null 情况13.实例方法public U OptionalU flatMap(Function? super T, OptionalU mapper)publicU OptionalU flatMap(Function? super T, OptionalU mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } }作用对值应用一个返回Optional的函数并“拍平”嵌套。与map的区别mapOptionalT → OptionalOptionalU需要拍平flatMapOptionalT → OptionalU自动拍平用途处理返回Optional的方法链。示例userOpt.flatMap(User::getAddress); // getAddress() 返回 OptionalAddressmapvsflatMap快速区分方法适用场景返回类型处理map转换函数返回普通对象如String,Integer自动包装为OptionalUflatMap转换函数返回OptionalU不二次包装直接返回该Optional// map 会导致嵌套 OptionalOptionalString bad userOpt.map(u - Optional.of(u.getName())); // flatMap 避免嵌套 OptionalString good userOpt.flatMap(u - Optional.of(u.getName()));14.实例方法public T orElse(T other)public T orElse(T other) { return value ! null ? value : other; }作用有值返回值否则返回other。注意other是立即求值的即使不用也会计算。示例# orElse方法 String name opt.orElse(Guest); # 714组合方法 Optional.ofNullable(users).orElse(Collections.emptyList())15.实例方法public T orElseGet(Supplier? extends T other)public T orElseGet(Supplier? extends T other) { return value ! null ? value : other.get(); }作用有值返回值否则调用other.get()获取默认值。优势Supplier是惰性求值仅在需要时调用适合开销大的操作。示例config.orElseGet(() - loadFromDisk());16.实例方法public X extends Throwable T orElseThrow(Supplier? extends X exceptionSupplier)public X extends Throwable T orElseThrow(Supplier? extends X exceptionSupplier) throws X { if (value ! null) { return value; } else { throw exceptionSupplier.get(); } }作用有值返回值否则抛出异常。用途替代get()提供清晰的错误语义。示例user.orElseThrow(UserNotFoundException::new);17.重写方法public boolean equals(Object obj)Override public boolean equals(Object obj) { if (this obj) { return true; } if (!(obj instanceof Optional)) { return false; } Optional? other (Optional?) obj; return Objects.equals(value, other.value); }规则都是Optional要么都为空要么值通过equals()相等用途支持集合操作如SetOptional但不推荐这样做。18.重写方法public int hashCode()Override public int hashCode() { return Objects.hashCode(value); }规则有值 →value.hashCode()无值 →0与equals一致满足哈希契约。19.重写方法public String toString()Override public String toString() { return value ! null ? String.format(Optional[%s], value) : Optional.empty; }格式有值Optional[value]无值Optional.empty用途调试友好明确区分空与非空。✅ 总结Optional 的设计哲学表格类别方法核心目的创建empty(),of(),ofNullable()安全构造 Optional检查isPresent(),get()判断/获取值谨慎用get消费ifPresent()有值则执行副作用转换map(),flatMap()链式处理值过滤filter()条件保留值回退orElse(),orElseGet(),orElseThrow()处理无值情况对象契约equals(),hashCode(),toString()支持调试和集合但不鼓励用于集合