Java程序员如何用lambda表达式花式作死

Java花式if-else链式调用
本文介绍了一种使用Java Lambda表达式和方法链实现的复杂if-else结构,通过构造器和Supplier、Runnable接口展示了如何模拟条件判断和相应动作执行,尽管其设计初衷仅为娱乐,但不失为一种理解Lambda和方法链调用方式的独特视角。

概述

  这篇博文用lambda表达式和三目运算符模拟 if-elseIf-else 形式作为反面教材来阐述这类花式作死,仅供娱乐,博大家一笑。
  最后达到的效果如下:

cIf(cond1, () -> {				//开头的 if
    //do action 1
}).cElseIf(() -> cond2, () -> {		//对 cond2 条件求值的 else if
    //do action 2
}).cElseIf(cond3, () -> {			//对 cond3 无条件求值的 else if
    //do action 3
}).cElse(() -> {					//最后的 else
    //do action 4
});

实现

  采用构造器配合方法链来实现,省略空指针检测,主要类如下:

/**
 * 整个语句块的构造器
 */
class IfBuilder {
    /* 隐藏构造方法 */
    private IfBuilder() {
    }

    /**
     * @param predicate 无条件求值的断言
     * @param action    要执行的动作
     * @return 同下面 cIf
     */
    public static IfBuilder cIf(boolean predicate, Runnable action) {
        return cIf(() -> predicate, action);                //转为条件求值的断言,调用重载方法 cIf
    }

    /**
     * @param predicate 条件求值的断言
     * @param action    要执行的动作
     * @return 如果断言求值为 true, 就返回默认什么都不做的 builder,否则返回具有后续 elseIf 和 else 功能的 builder
     */
    public static IfBuilder cIf(Supplier<Boolean> predicate, Runnable action) {
        return predicate.get()                  //对断言求值
                ?
                ((Supplier<IfBuilder>) () -> {  //断言的结果是 true, 求值 action,并返回一个没有实现功能的空 builder
                    action.run();
                    return new IfBuilder();
                }).get()
                :
                new IfBuilder() {               //断言的结果是 false,不求值 action, 返回一个具有后续 elseIf 和 else 功能的 builder
                    /* 表示是否有断言返回 true 的标志变量 */
                    private boolean elseIfFlag = false;

                    @Override
                    public IfBuilder cElseIf(Supplier<Boolean> b, Runnable r) {
                        /* 如果断言为 true 就求值 r, 然后把 elseIfFlag 变为 true,返回一个空的 builder; 否则,直接返回自身 */
                        return b.get() ? ((Supplier<IfBuilder>) () -> {
                            r.run();
                            elseIfFlag = true;
                            return new IfBuilder();
                        }).get() : this;
                    }

                    @Override
                    public IfBuilder cElseIf(boolean b, Runnable r) {
                        return cElseIf(() -> b, r);
                    }

                    @Override
                    public void cElse(Runnable r) {
                        /* 当且仅当之前没有 elseIf 满足的情况下,求值 r */
                        ((Supplier<IfBuilder>) () -> elseIfFlag ? this : ((Supplier<IfBuilder>) () -> {
                            r.run();
                            return this;
                        }).get()).get();
                    }
                };
    }

    /* 对断言条件求值的默认 else if, 无动作*/
    public IfBuilder cElseIf(Supplier<Boolean> b, Runnable r) {
        return this;
    }

    /* 对断言无条件求值的默认 else if, 无动作*/
    public IfBuilder cElseIf(boolean b, Runnable r) {
        return this;
    }

    /* 默认 else, 无动作*/
    public void cElse(Runnable r) {
    }
}

示例

示例代码如下,其中 i 和 j 每次用随机数生成

for (int x = 0; x < 10; x++) {
    int i = new Random().nextInt() % 4;
    int j = new Random().nextInt() % 4;

    cIf(i == 0 || j == 0, () -> {
        System.out.println(i + " " + j + " : i == 0 || j == 0");
    }).cElseIf(() -> i < j, () -> {
        System.out.println(i + " " + j + " : i < j");
    }).cElseIf(i > j, () -> {
        System.out.println(i + " " + j + " : i > j");
    }).cElse(() -> {
        System.out.println(i + " " + j + " : i = j");
    });
}

示例输出:

-3 -1 : i < j
3 -3 : i > j
2 -2 : i > j
0 -1 : i == 0 || j == 0
-1 -2 : i > j
-1 -1 : i = j
-1 -2 : i > j
0 0 : i == 0 || j == 0
2 1 : i > j
2 1 : i > j

结尾

  写着玩的代码,写完自己都想吐槽了。看着用了一些高级的写法,不仅完全没有解决什么问题,而且还带来了很大的代码复杂性。

Java中的Lambda表达式Java 8引入的一项重要特性,它使得代码更加简洁,并支持函数式编程风格。Lambda表达式本质上是一个匿名函数,能够作为参数传递给方法或存储在变量中,特别适用于实现只包含一个抽象方法的接口(即函数式接口)。 ### Lambda表达式的语法结构 Lambda表达式的基本语法可以分为两种形式: 1. **单表达式形式**:`(parameters) -> expression` 2. **代码块形式**:`(parameters) -> { statements; }` 其中,参数列表可以有多个参数、一个参数或没有参数。如果只有一个参数,括号可以省略。表达式形式的Lambda表达式会自动返回表达式的结果,而代码块形式则需要显式使用`return`语句来返回值。 ### 示例代码 以下是一些常见的使用Lambda表达式的场景及其示例代码: #### 1. 使用Lambda表达式实现`Runnable`接口 ```java // 传统方式 Runnable r1 = new Runnable() { @Override public void run() { System.out.println("传统写法"); } }; // Lambda写法 Runnable r2 = () -> System.out.println("Lambda写法"); // 启动线程 new Thread(r1).start(); new Thread(r2).start(); ``` #### 2. 使用Lambda表达式进行集合遍历 ```java import java.util.Arrays; import java.util.List; public class LambdaExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // 使用Lambda表达式遍历集合 names.forEach(name -> System.out.println(name)); } } ``` #### 3. 使用Lambda表达式实现比较器 ```java import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; public class ComparatorExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // 使用Lambda表达式定义比较器 Collections.sort(names, (a, b) -> a.compareTo(b)); // 输出排序后的列表 names.forEach(System.out::println); } } ``` #### 4. 使用Lambda表达式与`Stream` API结合 ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // 使用Lambda表达式过滤并收集结果 List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); // 输出偶数列表 evenNumbers.forEach(System.out::println); } } ``` #### 5. 使用Lambda表达式定义函数式接口 ```java @FunctionalInterface interface MathOperation { int operate(int a, int b); } public class FunctionalInterfaceExample { public static void main(String[] args) { // 使用Lambda表达式实现接口方法 MathOperation add = (a, b) -> a + b; MathOperation subtract = (a, b) -> a - b; System.out.println("Add: " + add.operate(10, 5)); System.out.println("Subtract: " + subtract.operate(10, 5)); } } ``` ### 注意事项 - Lambda表达式只能用于函数式接口,即接口中只有一个抽象方法。 - Lambda表达式可以访问外部变量,但这些变量必须是`final`或等效不可变的。 - Lambda表达式可以简化代码,但也需要注意可读性和维护性,避免过度简化导致逻辑难以理解。 通过上述示例可以看到,Lambda表达式Java中极大地简化了代码的编写,特别是在与`Stream` API结合使用时,能够高效地处理集合数据[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值