如何使用Java8 Optional及Lambda函数替换嵌套if else代码块
Java 8 Optional 改写方案
Java 9+ 最简写法(逻辑完全等价原有代码)
ifPresentOrElse是Java 9引入的Optional方法,可以同时处理有值和无值的场景:
myData.ifPresentOrElse( // 有值的场景:对应原有第一层if的逻辑 value -> { if (value.contains("testValue")) { mySet.add("somedata"); } }, // 无值的场景:对应原有!myData.isPresent()的逻辑 () -> mySet.add("someotherdata") );
如果想要完全消除代码块里的if判断,可以结合filter拆分两个执行逻辑,和上面写法等价:
// 处理:有值且包含testValue的场景 myData.filter(value -> value.contains("testValue")) .ifPresent(value -> mySet.add("somedata")); // 处理:无值的场景 myData.isEmpty() ? mySet.add("someotherdata") : null;
Java 8 兼容写法
Java 8的Optional没有ifPresentOrElse和isEmpty方法,可以用以下写法实现同等效果:
// 处理:有值且包含testValue的场景 myData.filter(value -> value.contains("testValue")) .ifPresent(value -> mySet.add("somedata")); // 处理:无值的场景,利用orElseGet的副作用实现(无值时才会执行括号内逻辑) myData.orElseGet(() -> { mySet.add("someotherdata"); return ""; });
如果不排斥保留一行非嵌套的if判断,也可以写为更易读的形式:
myData.filter(value -> value.contains("testValue")) .ifPresent(value -> mySet.add("somedata")); if (!myData.isPresent()) { mySet.add("someotherdata"); }
逻辑验证
所有写法都和原有嵌套if逻辑完全一致:
- 当
myData有值且包含testValue:往mySet添加somedata - 当
myData有值但不包含testValue:不做任何操作 - 当
myData为空:往mySet添加someotherdata
内容的提问来源于stack exchange,提问作者sai teja
相关产品推荐
相关产品推荐

