为什么很多程序员不用switch,而是大量 的if......else if?

不会吧还有人用if else和switch case?三目运算符?

不会吧? 不会吧?大佬都是全都不用的!以JAVA为例

条件判断语句的四种写法,茴字的四种写法大家不会不知道吧

1.正常人写法:

private static String MAN = "man";
private static String WOMAN = "woman";
@Data
static class Person{private String gender;private String name;
}  
public static void main(String[] args) {Person p = new Person();p.setGender(MAN);p.setName("张三");if(Objects.equals(p.getGender(),MAN)){System.out.println(p.getName() + "应该去男厕所");}if(Objects.equals(p.getGender(),WOMAN)){System.out.println(p.getName() + "应该去女厕所");}}

//输出 :张三应该去男厕所
2.Lambda策略模式写法:

某些大公司P6级别以上(年薪30w-50w)标准写法,写if else是要被骂的

private static Map<String, Consumer<String>> FUNC_MAP = new ConcurrentHashMap<>();
private static String MAN = "man";
private static String WOMAN = "woman";
static {FUNC_MAP.put(MAN,person ->{System.out.println(person + "应该去男厕所");});FUNC_MAP.put(WOMAN,person ->{System.out.println(person + "应该去女厕所");});
}
@Data
static class Person{private String gender;private String name;
}
public static void main(String[] args) {Person p = new Person();p.setGender(MAN);p.setName("张三");Person p2 = new Person();p2.setGender(WOMAN);p2.setName("张三他老婆");FUNC_MAP.get(p.getGender()).accept(p.name);FUNC_MAP.get(p2.getGender()).accept(p2.name);}

//输出:
//张三应该去男厕所
//张三他老婆应该去女厕所
3.DDD领域驱动设计思想+策略模式写法:

某些大公司P7级别以上(年薪40w-70w)标准写法(笑)

private static String MAN = "man";
private static String WOMAN = "woman";
@Data
static class Person{private String gender;private String name;private static Map<String, Consumer<String>> FUNC_MAP = new ConcurrentHashMap<>();static {FUNC_MAP.put(MAN,person ->{System.out.println(person + "应该去男厕所");});FUNC_MAP.put(WOMAN,person ->{System.out.println(person + "应该去女厕所");});}public void goToWC(){FUNC_MAP.get(gender).accept(name);}
}static class PersonFactory{public static Person initPerson(String name ,String gender){Person p = new Person();p.setName(name);p.setGender(gender);return p;}
}
public static void main(String[] args) {Person p = PersonFactory.initPerson("张三",MAN);Person p2 = PersonFactory.initPerson("张三他老婆",WOMAN);p.goToWC();p2.goToWC();
}

//输出:
//张三应该去男厕所
//张三他老婆应该去女厕所
某些奇葩公司就是喜欢这种语法,看起来够装逼,实际上效率并没有高多少,可读性差了很多,而且Debug比较麻烦
4.Actor模型+领域驱动设计+策略模式+事件响应式架构

真正的P8年薪百万架构师级写法,逼王才这么写代码,装逼的极限,内卷的奥义

Maven依赖:

依赖Akka框架 Actor模型,懂得都懂,大数据分布式计算Spark框架RDD依赖的框架,很复杂,源码是Scala语言,逼王必学。也可以Scala做架构,Java做上层,有兴趣可以了解一下,反正管他是什么,够牛逼就完了。哎,就是得有牌面。if else什么的太low,应届毕业生水平才写if else(魔怔领导原话)。

   <dependency><groupId>com.typesafe.akka</groupId><artifactId>akka-actor_2.12</artifactId><version>2.5.2</version></dependency>

代码

private static String MAN = "man";
private static String WOMAN = "woman";
private static String WC_EVENT= "想上厕所";
@Data
static class Person extends UntypedActor {private String gender;private String name;public static Props props(final String name,final String gender) {return Props.create(new Creator<Person>() {private static final long serialVersionUID = 1L;@Overridepublic Person create() throws Exception {Person p = new Person();p.setGender(gender);p.setName(name);return p;}});}@Overridepublic void onReceive(Object message) throws Throwable {Pair<String,ActorRef> m = (Pair<String,ActorRef>)message;System.out.println(name + m.getLeft());m.getRight().tell(this, ActorRef.noSender());}
}@Data
static class Toilet extends UntypedActor {private static Map<String, Consumer<String>> FUNC_MAP = new ConcurrentHashMap<>();static {FUNC_MAP.put(MAN,person ->{System.out.println(person + "应该去男厕所");});FUNC_MAP.put(WOMAN,person ->{System.out.println(person + "应该去女厕所");});}public void wc(Person p ){FUNC_MAP.get(p.getGender()).accept(p.getName());}public static Props props() {return Props.create(Toilet.class);}@Overridepublic void onReceive(Object message) throws Throwable {Person p = (Person) message;wc(p);}
}public static void main(String[] args) {ActorSystem actorSystem = ActorSystem.create();ActorRef person = actorSystem.actorOf(Person.props("张三",MAN), "ZhangSan");ActorRef toilet = actorSystem.actorOf(Toilet.props(), "Toilet");Pair<String,ActorRef> message = Pair.of(WC_EVENT,toilet);person.tell(message,ActorRef.noSender());
}

//输出
//张三想上厕所
//张三应该去男厕所
5.Actor模型+领域驱动设计+策略模式+事件响应式架构+动态类模板构建+运行时编译

为什么要写if else?为什么要创建类?为什么要写方法?真正的大佬(神经病)根本不需要写if else,也不需要创建class,甚至不需要命名方法。我上厕所就要写Toilet 类,开车就要写Car类,还得继承Actor的抽象类,太low,真正的Java不需要类型,不需要类,不需要if else,不需要命名方法,什么都不需要,便是Java的极致。我悟了。

Maven依赖:

咱还得整新活,javassist动态类加载,框架级代码才会用,运行时调编译器搞起,类型什么的根本不需要,咱就是要颠覆Java的根基,什么class,小孩才写class ,大人都是玩编译器。

   <dependency><groupId>com.typesafe.akka</groupId><artifactId>akka-actor_2.12</artifactId><version>2.5.2</version></dependency><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.25.0-GA</version></dependency>

代码:

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;
import akka.japi.Creator;
import javassist.*;
import org.apache.commons.lang3.tuple.Pair;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class DynamicActorTest {

private static String MAN = "man";
private static String WOMAN = "woman";
private static String WC_EVENT= "想上厕所";
private static String WC_OVER_EVENT = "上完厕所了";private static ActorSystem actorSystem = ActorSystem.create();/*** 创建一个动态类,并实例化为对象,该方法会根据参数动态构建Class* @param name 动态类名* @param function actor模型消息处理方法 两个参数 一个是自身,一个是消息* @param attrAndValues 动态类的 属性 和 属性值* @return actor引用* @throws Exception*/
public static ActorRef createDynamicClassImpl(String name, BiConsumer function, Pair<String, String>... attrAndValues) throws Exception {ClassPool pool = ClassPool.getDefault();// 动态定义包名 瞎几把写就行String className = "com.xxx.xxx.xxx." + name;// 创建一个空类CtClass cc = pool.makeClass(className);// 动态继承抽象类UntypedActorcc.setSuperclass(pool.get(UntypedActor.class.getName()));// 动态根据参数创建类的属性for (Pair<String, String> attrValue : attrAndValues) {CtField param = new CtField(pool.get(String.class.getName()), attrValue.getLeft(), cc);// 访问级别是 PUBLICparam.setModifiers(Modifier.PUBLIC);cc.addField(param, CtField.Initializer.constant(attrValue.getRight()));}//创建类一个属性叫function 类型是BiConsumerCtField param = new CtField(pool.get(BiConsumer.class.getName()), "function", cc);//访问级别是 PRIVATEparam.setModifiers(Modifier.PRIVATE);cc.addField(param);//创建模板方法 方法是执行BiConsumer对应的lambda表达式CtMethod m = CtNewMethod.make("public void onReceive(Object message) { function.accept($0 ,message);}",cc);cc.addMethod(m);// 动态添加构造函数CtConstructor cons = new CtConstructor(new CtClass[]{pool.get(BiConsumer.class.getName())}, cc);// 构造函数内容就是给function参数赋值cons.setBody("{ $0.function = $1 ;}");cc.addConstructor(cons);//-----------动态Actor类构建完毕------------// 实例化ActorProps p = Props.create(new Creator<UntypedActor>() {@Overridepublic UntypedActor create() throws Exception {//反射创建对象return (UntypedActor)cc.toClass().getConstructor(BiConsumer.class).newInstance(function);}});return actorSystem.actorOf(p);
}public static void main(String[] args) throws Exception {// class什么的根本不需要,直接动态创建类,对于复杂场景可以搞分布式remoteActor// 创建一个Car类(领域对象),并实例化,定义他的消息处理方法(或者你乐意叫领域驱动事件也可以)ActorRef car = createDynamicClassImpl("Car",(self, message)->{System.out.println(message);System.out.println("开车走咯~");});// 创建一个Toilet类,并实例化,定义他的消息处理方法(或者你乐意叫领域驱动事件也可以)ActorRef toilet = createDynamicClassImpl("Toilet", (self, message) ->{try {Map<String, Consumer<String>> FUNC_MAP = new HashMap<>();FUNC_MAP.put(MAN,person ->{System.out.println(person + "应该去男厕所");});FUNC_MAP.put(WOMAN,person ->{System.out.println(person + "应该去女厕所");});// 因为是无类型取值使用反射String gender = message.getClass().getField("gender").get(message).toString();String name = message.getClass().getField("name").get(message).toString();FUNC_MAP.get(gender).accept(name);car.tell(name+WC_OVER_EVENT,ActorRef.noSender());} catch (Exception e) {System.out.println("厕所不太欢迎这位");}});// 创建一个Person类,具有两个属性name和gender,并实例化,定义他的消息处理方法(或者你乐意叫领域驱动事件也可以)ActorRef person = createDynamicClassImpl("Person", (self, message) -> {Pair<String,ActorRef> pair = (Pair<String,ActorRef>) message;System.out.println(pair.getLeft());pair.getRight().tell(self,ActorRef.noSender());}, Pair.of("name", "张三"), Pair.of("gender", MAN));// 告诉张三想上厕所了 让他找厕所去person.tell(Pair.of(WC_EVENT,toilet), ActorRef.noSender());
}

}
//输出:
//想上厕所
//张三应该去男厕所
//张三上完厕所了
//开车走咯~
这样写代码,基本会被开除,你已经无敌了 公司已经容不下你了。

总结,代码还是正常写就得了,能实现业务不出bug好维护的就是好代码,切勿为了装逼使用各种奇技淫巧,if else没啥不好的。

原创声明

作者zh:古明地觉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中断(tasklet,工作队列,内核线程的使用)

文章目录 前言一、tasklet二、工作队列三、内核线程总结 前言 本篇文章来讲解在Linux中tasklet,工作队列,内核线程的使用。 一、tasklet tasklet在内核里面其实就是下面这样的一个结构体&#xff1a; struct tasklet_struct {struct tasklet_struct *next;unsigned long st…

使用的华为云RDS数据库不小心把数据删了

目录 前言恢复qp文件帮助文档表级时间点恢复删除数据的时候要注意 前言 华为云查数据的时候前面是有个序号的&#xff0c;删除数据的时候不小心把序号看成id了&#xff0c;导致误删数据。 注&#xff1a;图片如果看不清楚可以点击放大观看&#xff01; 恢复qp文件 华为云每天…

2023最新软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;毕…

机器学习之主成分分析(Principal Component Analysis)

1 主成分分析介绍 1.1 什么是主成分分析 主成分分析&#xff08;Principal Component Analysis&#xff09;简称PCA&#xff0c;是一个非监督学习的机器学习算法&#xff0c;主要用于数据的降维&#xff0c;对于高维数据&#xff0c;通过降维&#xff0c;可以发现更便于人类理…

CVPR2023新作:pix2pix3D

Title: 3D-Aware Conditional Image SynthesisAffiliation: Carnegie Mellon University (卡内基梅隆大学)Authors: Kangle Deng, Gengshan Yang, Deva Ramanan, Jun-Yan ZhuKeywords: Image Synthesis, 3D-aware, Neural Radiance Fields, Interactive Editing, Conditional G…

Qt+GDAL开发笔记(一):在windows系统mingw32编译GDAL库、搭建开发环境和基础Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131931309 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

驱动开发 day3 (模块化驱动启动led,蜂鸣器,风扇,震动马达)

模块化驱动启动led,蜂鸣器,风扇,震动马达并加上Makefile 封装模块化驱动&#xff0c;可自由安装卸载驱动&#xff0c;便于驱动更新(附图) 1.安装模块驱动同时初始化各个设备并使能 2.该驱动会自动创建驱动节点. 3.通过c函数程序输入控制各个设备 4.卸载模块驱动 //编译驱动…

K8s卷存储详解(一)

K8s卷存储详解&#xff08;一&#xff09; K8s 存储K8s卷分类K8s目前支持的卷类型 临时卷类型EmptyDirCSI 临时卷通用临时卷 K8s 存储 什么是卷&#xff1f;为什么要用卷&#xff1f; 我们知道K8s是基于容器&#xff0c;对各个Pod进行管理的。Pod是由容器构成的&#xff0c;我…

开发中遇到的 cookie 问题

1. cookie 无法跨域携带问题 尽管已经登录&#xff0c;但是请求接口返回状态码&#xff1a;202&#xff0c;msg&#xff1a; 未登录&#xff0c;如下图所示&#xff1b; 1.1 XMLHttpRequest.withCredentials未设置 如果需要跨域 AJAX 请求发送 Cookie&#xff0c;需要withCre…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

MATLAB实现图像处理:图像识别、去雨、去雾、去噪、去模糊等等(附上20个完整仿真源码)

图像处理是计算机视觉领域的重要研究方向&#xff0c;MATLAB是一种功能强大的数学计算软件&#xff0c;可以用于图像处理和分析。下面是一些简单的MATLAB图像处理代码示例&#xff0c;包括图像增强、边缘检测、形态学处理、特征提取等。 文章目录 1. 图像增强2. 边缘检测3. 形态…

【雕爷学编程】Arduino动手做(88)---水流量传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Springboot初识(二)

文章目录 前言一.Spring配置文件1.1 配置文件的作用1.2 配置文件的类型 二.properties配置⽂件说明2.1 基本语法2.2 读取配置文件 三.yml 配置⽂件说明2.1 基本语法2.2 读取配置文件2.3 注意事项 前言 上篇文章我们介绍了什么是SpringBoot和怎么去创建一个SpringBoot项目,现在…

Navicat连接服务器上Docker安装的mysql提示拒绝连接

一、报错的原因 英语翻译 --- ‘不允许主机连接到此MySQL服务器’ &#xff08;意思是本地账号连接可以登录&#xff0c;但是远程登陆不行&#xff09; 二、解决方法 ①进入docker中的mysql容器 docker exec -it mysql bash ②登陆mysql mysql -uroot -p ③执行以下步骤…

13.5.3 【Linux】PAM 模块设置语法

PAM 借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以passwd 这个指令的调用 PAM 来说明好了。 当你执行 passwd 后&#xff0c;这支程序调用 PAM 的流程是&#xff1a; 1. 使用者开始执行 /usr/bin/passwd 这支程序&#xff0c;并输入密码&#xf…

Mongodb 多文档聚合操作处理方法(Map-reduce 函数)

聚合 聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来&#xff1a; 将多个文档中的值分组在一起。 对分组数据执行操作以返回单个结果。 分析数据随时间的变化。 要执行聚合操作&#xff0c;您可以使用&#xff1a; 聚合管道 单一目的聚合方法 Map-reduce 函…

基于Java+SpringBoot+vue前后端分离在线商城系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

spring 存储对象 + 获取对象

前言 本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中&#xff0c;了解如何使用注释来获取容器中的Bean对象&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1.通过注释将类加入IoC…

【云计算小知识】云环境是什么意思?有什么优点?

随着云计算的快速发展&#xff0c;了解云计算相关知识也是运维人员必备的。那你知道云环境是什么意思&#xff1f;有什么优点&#xff1f;云环境安全威胁有哪些&#xff1f;如何保证云环境的运维安全&#xff1f;这里我们就来简单聊聊。 云环境是什么意思&#xff1f; 云环境是…

SpringBoot中配置文件的加载

springboot 启动会扫描一下位置的application.properties或者application.yml文件作为springboot的默认配置文件 file:./config/(项目根目录config文件夹下的配置文件) file:./(项目根目录下的配置文件) classpath:/config/(resources目录config文件下的配置文件) classpat…