如何使用Lambda编写if代码块?如何用Java 8 Lambda改写指定条件表达式?
Java Lambda 条件逻辑实现指南
嘿,这两个Java Lambda相关的问题我熟,给你掰扯清楚!
问题1:如何用Lambda编写if代码块?
Lambda本质是实现函数式接口的匿名函数,它本身不是用来直接替换if关键字的,但我们可以结合Java 8提供的函数式API(比如Predicate、Optional、Stream等),用更简洁的函数式风格处理条件逻辑。下面是几个常见场景的实用例子:
场景1:用
Predicate封装可复用的判断条件
如果某个条件判断需要多次使用,把它抽成Predicate会让代码更干净:// 定义一个Predicate,封装"字符串非空且长度大于5"的判断 Predicate<String> isLongValid = s -> s != null && s.length() > 5; String testStr = "HelloWorld"; if (isLongValid.test(testStr)) { System.out.println("字符串长度达标啦!"); }场景2:用
Optional替代null判断的if-else
处理null值分支时,Optional的ifPresent()和ifPresentOrElse()能完美替代传统的if (x != null)逻辑:String x = "1"; // 替代if(x != null) { ... } else { ... } Optional.ofNullable(x) .ifPresent(val -> { // x不为null时执行的逻辑 System.out.println("拿到x的值:" + val); }) .orElseGet(() -> { // x为null时执行的逻辑 System.out.println("x是空的哦"); return null; });场景3:用
Stream.filter()处理集合条件筛选
对集合元素做条件过滤时,filter()方法本身就是用Lambda实现的条件判断,这也是Lambda最常用的场景之一:List<String> words = Arrays.asList("Hello", "Helloo", "Hi", "Hey"); // 筛选所有以"Hell"开头的单词 List<String> filteredWords = words.stream() .filter(word -> word.startsWith("Hell")) .collect(Collectors.toList());
问题2:用Java 8/Lambda改写给定的条件表达式
先看你的原代码:
String str = "Hello"; String x = "1"; if(str.equals("Hello") || str.equals("Helloo") || str.equals("Hellooo") || str.equals("Hellooo...")) { if(x != null) { // do something } else { // do something else } }
核心逻辑是判断str是否属于指定字符串集合,再根据x是否为null执行不同操作。用Java 8的特性改写后,代码会更简洁易维护,具体如下:
基础改写版
String str = "Hello"; String x = "1"; // 把需要匹配的字符串放进集合,用contains替代多个||判断,可读性拉满 Set<String> targetStrings = new HashSet<>(Arrays.asList("Hello", "Helloo", "Hellooo", "Hellooo...")); if (targetStrings.contains(str)) { // 用Optional处理x的null分支,替代嵌套if Optional.ofNullable(x) .ifPresent(val -> { // 原代码中do something的逻辑,示例: System.out.println("x不为null,执行操作:" + val); }) .orElseGet(() -> { // 原代码中do something else的逻辑,示例: System.out.println("x为null,执行备选操作"); return null; }); }
进阶复用版
如果字符串匹配的逻辑需要在多处使用,可以封装成Predicate:
// 封装匹配逻辑,方便复用 Predicate<String> matchesTargetStr = s -> new HashSet<>(Arrays.asList("Hello", "Helloo", "Hellooo", "Hellooo...")).contains(s); if (matchesTargetStr.test(str)) { Optional.ofNullable(x) .ifPresent(val -> { /* do something */ }) .orElseGet(() -> { /* do something else */ }); }
全函数式风格(可选)
如果想彻底避免显式if,可以结合Predicate和函数式接口把逻辑链式串起来(适合复杂场景,简单场景下显式if更直观):
Set<String> targetStrings = new HashSet<>(Arrays.asList("Hello", "Helloo", "Hellooo", "Hellooo...")); Predicate<String> strMatches = targetStrings::contains; Consumer<String> nonXNullOp = val -> { /* do something */ }; Runnable xNullOp = () -> { /* do something else */ }; // 链式执行逻辑 Optional.of(str) .filter(strMatches) .ifPresent(s -> Optional.ofNullable(x).ifPresentOrElse(nonXNullOp, xNullOp));
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

