java中分支逻辑(if、switch)不驱动stream,而是嵌入filter、map、collect等操作中处理元素;可用三元表达式、方法引用或switch表达式实现条件筛选与转换,并结合optional链式方法安全处理结果。

Java 中的分支逻辑(如 if、switch)本身不是流处理工具,但可以和 Stream API 结合,在 流的中间或终端操作中嵌入条件判断,从而实现灵活的数据筛选、转换与聚合。关键不是用分支“驱动”流,而是让分支逻辑服务于流中的每个元素处理。
在 filter() 中用 if 或三元表达式做条件过滤
filter() 接收 Predicate,适合写简洁的布尔表达式。复杂判断可封装成方法,或直接用内联逻辑:
- 基础写法:
stream.filter(x -> x > 0 && x % 2 == 0) - 多条件分支可转为逻辑组合:
stream.filter(x -> (x 5 : x - 避免在 filter 中写副作用(如打印、修改外部变量),保持无状态
在 map() 中用 switch 或 if-else 实现分类型转换
当元素需按类别映射为不同结果时,map() 内部可用分支逻辑统一处理:
- 例如按字符串首字母分类:
map(s -> { switch(s.charAt(0)) { case 'A': return "Group A"; case 'B': return "Group B"; default: return "Other"; } }) - Java 14+ 支持 switch 表达式,更简洁:
map(s -> switch(s.length()) { case 1 -> "tiny"; case 2,3 -> "small"; default -> "large"; }) - 注意返回类型必须一致,必要时用 Optional 或统一包装类
在 collect() 前用 if 控制是否启用流处理
流本身是懒执行的,但整个流水线是否执行,可由外部分支控制:
- 比如只在列表非空时才走流逻辑:
if (!list.isEmpty()) list.stream().map(...).collect(...); - 避免对 null 集合调用 stream(),建议先判空或用 Collections.emptyList()
- 不要在 forEach() 里嵌套复杂 if 作业务分流——这会破坏函数式风格,改用 filter + map 组合更清晰
用 Optional + 分支逻辑处理可能为空的流结果
终端操作如 findFirst() 返回 Optional,后续用 ifPresent() 或 orElse() 衔接分支行为:
stream.findFirst().ifPresentOrElse( value -> System.out.println("Found: " + value), () -> System.out.println("Not found") );- 避免用 isPresent() + get() 拆箱,优先使用 map/flatMap/orElse 等链式方法
- 若需根据 Optional 内容做多重判断,可先 map 转换再 flatMap 处理嵌套逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











