当前位置:   article > 正文

最全Java8:自制多糖 switch,什么是分布式系统,如何学习分布式系统_switch case java8

switch case java8

Docker步步实践

目录文档:

①Docker简介

②基本概念

③安装Docker

④使用镜像:

⑤操作容器:

⑥访问仓库:

⑦数据管理:

⑧使用网络:

⑨高级网络配置:

⑩安全:

⑪底层实现:

⑫其他项目:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

JDK 12JDK 13 已经发布了,伴随着许多对 Java 语法的小改进,比如我们非常熟悉的 switch

1.1 JDK12 之前

switch (type) {

case “all”:

System.out.println(“列出所有帖子”);

break;

case “auditing”:

System.out.println(“列出审核中的帖子”);

break;

case “accepted”:

System.out.println(“列出审核通过的帖子”);

break;

case “rejected”:

System.out.println(“列出审核不通过的帖子”);

break;

default:

System.out.println(“参数’type’错误,请检查”);

break;

}

1.2 JDK12

switch (type) {

case “all” -> System.out.println(“列出所有帖子”);

case “auditing” -> System.out.println(“列出审核中的帖子”);

case “accepted” -> System.out.println(“列出审核通过的帖子”);

case “rejected” -> System.out.println(“列出审核不通过的帖子”);

default -> System.out.println(“参数’type’错误,请检查”);

}

1.3 JDK13

String value = switch (i) {

case 0 -> “zero”

case 1 -> “one”

case 2 -> “two”

default -> “many”

};

新特性很美好,但是如今在业界最流行的版本依然是 JDK8,所以想要在生产环境用上这么舒服的 switch,目前看来还是遥遥无期。好在我们还有 Lambda,正所谓 “自己动手,丰衣足食”,我们来试试能不能自己做出一个和JDK12 & JDK13swtich 类似的东西,给我们平淡的编码生活,加点糖。

2. 实现


2.1 对标 JDK12switch

首先,我们定义一个 Switch 类,然后它接收一个泛型参数,就类似与 Javaswitch 语句,需要先接收一个参数。

public class Switch {

/**

  • 输入值

*/

private final T input;

private Switch(T input) {

this.input = input;

}

public static <T, R> Switch<T, R> on(T value) {

return new Switch<>(value);

}

}

通过静态方法 on(on(input) 可以理解为在 value 上做 Switch 操作),我们可以构造出一个 Switch 实例。然后,我们定义一个Predicate,用来表示当前的条件:

public class Switch {

private Predicate condition;

public Switch is(T target) {

// 判断输入值是否和 target 相等

condition = Predicate.isEqual(target);

return this;

}

}

is 方法的作用就是将当前的条件 condition 定义为 判断 Switch 的输入值是否和传入的 target 相等。既然都引入条件了,自然我们可以让用户自己来定义条件:

public Switch<T, R> is(T target) {

// 判断输入值是否和 target 相等

return when(Predicate.isEqual(target));

}

public Switch<T, R> when(Predicate condition) {

// 用户自己设定条件

this.condition = Objects.requireNonNull(condition);

return this;

}

接着我们就可以来定义 switch 语句中的case ... break 功能:

public Switch thenAccept(Consumer action) {

requireNonNullArgAndCondition(action);

if (condition.test(input)) {

action.accept(input);

}

return this;

}

void requireNonNullCondition() {

if (condition == null) {

throw new IllegalStateException(“A condition must be set first”);

}

}

void requireNonNullArgAndCondition(Object arg) {

Objects.requireNonNull(arg, "Null argument " + arg.getClass().getName());

requireNonNullCondition();

}

好像有点不对劲?对哦,switch 只能满足一个 case,如果是我们自己来设定各种条件,可能会存在多个条件都满足的情况 —— 那就不是我们预期的 switch 了。所以我们可以定义一个 boolean 标记,用来表示用户设定的多个条件是否存在某一个满足,如果有一个满足了,则该条件之后的链式方法都直接 短路处理。

public class Switch {

/**

  • 是否已经存在过满足的条件

*/

private boolean met;

public Switch<T, R> is(T target) {

return when(Predicate.isEqual(target));

}

public Switch<T, R> when(Predicate condition) {

// 短路处理

if (met) { return this; }

this.condition = Objects.requireNonNull(condition);

return this;

}

public Switch<T, R> thenAccept(Consumer action) {

// 短路处理

if (met) { return this; }

requireNonNullArgAndCondition(action);

if (condition.test(input)) {

action.accept(input);

// 标记已经存在过满足的条件

met = true;

}

return this;

}

}

好像还少了点什么?对哦,switch 还有个 default ... break。那我们定义一个 elseAccept 方法,当且仅当之前没有任何一个条件被满足时,调用这个方法:

public void elseAccept(Consumer action) {

// 之前存在被满足的条件,直接返回

if (met) { return; }

Objects.requireNonNull(action);

action.accept(input);

}

OK,我们来写个小 demo 对比感受一下:

// 获得前端传递的某个参数

String type = getType();

// 传统 switch

switch (type) {

case “all”:

System.out.println(“列出所有帖子”);

break;

case “auditing”:

System.out.println(“列出审核中的帖子”);

break;

case “accepted”:

System.out.println(“列出审核通过的帖子”);

break;

case “rejected”:

System.out.println(“列出审核不通过的帖子”);

break;

default:

System.out.println(“参数’type’错误,请检查”);

break;

}

// 我们的 Switch

Switch.on(type)

.is(“all”)

.thenAccept(t -> System.out.println(“列出所有帖子”))

.is(“auditing”)

.thenAccept(t -> System.out.println(“列出审核中的帖子”))

.is(“accepted”)

.thenAccept(t -> System.out.println(“列出审核通过的帖子”))

.is(“rejected”)

.thenAccept(t -> System.out.println(“列出审核不通过的帖子”))

.elseAccept(t -> System.out.println(“参数’type’错误,请检查”));

虽然我们的 Switch 看起来没有 JDK12switch 那样直观,但是比 JDK12 之前的 switch 语句更加简洁了 —— 而且链式调用,配合 Lambda,写起来更舒服了~ 更重要的是,我们都知道 switch 语句支持的类型有限(整数、枚举、字符,字符串),而我们自定义的 Switch,支持任何类型,比如:

Object value = getValue();

Switch.on(value)

.is(null)

.thenAccept(v -> System.out.println(“value is null”))

.is(123)

.thenAccept(v -> System.out.println(“value is 123”))

.is(“abc”)

.thenAccept(v -> System.out.println(“value is abc”))

.is(Arrays.asList(1, 2, 3))

.thenAccept(v -> System.out.println(“value is [1, 2, 3]”))

.elseAccept(v -> System.out.println(“Unknown value”));

而且我们还支持自定义条件语句,所以很显然,我们的 Switch 可以用来代替 if-else 语句:

Object value = getValue();

Switch.on(value)

.is(null)

.thenAccept(v -> System.out.println(“value is null”))

.when(Integer.class::isInstance)

.thenAccept(v -> System.out.println(“value is Integer”))

.when(String.class::isInstance)

.thenAccept(v -> System.out.println(“value is String”))

.when(Boolean.class::isInstance)

.thenAccept(v -> System.out.println(“value is Boolean”))

.elseAccept(v -> System.out.println(“Unknown type of value”));

// 等价的 if-else

if (value == null) {

System.out.println(“value is null”);

} else if (value instanceof Integer) {

System.out.println(“value is Integer”);

} else if (value instanceof String) {

System.out.println(“value is String”);

} else if (value instanceof Boolean) {

System.out.println(“value is Boolean”);

} else {

System.out.println(“Unknown type of value”);

}

至于哪个更好用和阅读起来更舒服,就 “仁者见仁,智者见智” 了。

2.2对标 JDK13 的 Switch

JDK13 中,赋予了 switch 语句求值的功能 —— 我们也可以很容易的改造我们的 Switch 来支持这个功能。首先,我们对 Switch 进行抽象,并定义 ConsumptionSwitch 作为消费用的 Switch(即上文中实现的 Switch),定义EvaluationSwitch 作为用于求值的 Switch。 抽象 Switch

public abstract class Switch {

/**

  • 输入值

*/

final T input;

/**

  • 当前的条件

*/

Predicate condition;

/**

  • 是否已经存在某个条件被满足

*/

boolean met;

Switch(T input) {

this.input = input;

}

/**

  • 在指定的值上使用 Switch,返回用于消费的 Switch 实例

*/

public static ConsumptionSwitch on(I input) {

return new ConsumptionSwitch<>(input);

}

/**

  • 在指定的输入值上使用 Switch,返回用于求值的 Switch 实例

*/

public static <I, O> EvaluationSwitch<I, O> in(I input) {

return new EvaluationSwitch<>(input);

}

/**

  • 判断输入是否和给定的目标相等

*/

protected Switch is(T target) {

return when(Predicate.isEqual(target));

}

/**

  • 设定输入值需要满足的条件

*/

protected Switch when(Predicate condition) {

// 短路处理

if (met) { return this; }

this.condition = Objects.requireNonNull(condition);

return this;

}

}

用于消费的的 Switch

/**

  • 用于消费的 Switch

  • @param 输入值的类型

*/

public static class ConsumptionSwitch extends Switch {

ConsumptionSwitch(V value) {

super(value);

}

@Override

public ConsumptionSwitch is(V target) {

super.is(target);

return this;

}

@Override

public ConsumptionSwitch when(Predicate condition) {

super.when(condition);

return this;

}

/**

  • 满足某个条件时,对输入值进行消费操作

*/

public ConsumptionSwitch thenAccept(Consumer action) {

// 短路处理

if (met) { return this; }

requireNonNullArgAndCondition(action);

if (condition.test(input)) {

action.accept(input);

// 标记已经存在过满足的条件

met = true;

}

return this;

}

/**

  • 不满足任一条件时,对输入值进行消费操作

*/

public void elseAccept(Consumer action) {

// 之前存在被满足的条件,直接返回

if (met) { return; }

Objects.requireNonNull(action);

action.accept(input);

}

}

改造完毕,现在我们可以来实现用于求值的 Switch。首先,定义一个泛化类型的返回值:

/**

  • 用于求值的 Switch

  • @param 输入值的类型

  • @param 输出值的类型

*/

public static class EvaluationSwitch<I, O> extends Switch {

/**

  • 输出

*/

private O output;

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

image

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

;

}

}

改造完毕,现在我们可以来实现用于求值的 Switch。首先,定义一个泛化类型的返回值:

/**

  • 用于求值的 Switch

  • @param 输入值的类型

  • @param 输出值的类型

*/

public static class EvaluationSwitch<I, O> extends Switch {

/**

  • 输出

*/

private O output;

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

[外链图片转存中…(img-7lR8nNdG-1715564126491)]

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号