不需要策略模式也能避免满屏if/else

news2024/11/17 21:24:21

满屏if/else

 

java

复制代码

public static void main(String[] args) { int a = 1; if(a == 1){ System.out.println("执行a=1的逻辑"); }else if (a == 2){ System.out.println("执行a=2的逻辑"); }else if (a == 3){ System.out.println("执行a=3的逻辑"); }else if (a == 4){ System.out.println("执行a=4的逻辑"); }else if (a == 5){ System.out.println("执行a=5的逻辑"); } }

可能不少开发同学刚接入代码的时候是这么写的,也可能是想省事,也可能是真的不知道用什么办法解决。但从今天开始,你看完这篇文章,你自己都不会允许自己出现上述情况。 大家也看过不少网上的帖子,大部分推荐用策略模式,工厂模式等。甚至还有同学站起来说: 我不用if/else,我用switch/case,那你是真强

今天1点东西教大家用不一样的方式避免if/else,如果还不了解上面提到的设计模式也可以先去我的主页看看我的专栏,超全设计模式的讲解。

话不多说 我们由浅入深,慢慢道来

解决办法

一、函数式编程

函数式编程也可以避免使用if语句,通过函数式编程的柯里化、高阶函数等特性,我们可以更好地处理条件分支等流程控制语句。

举个例子,我们来看一个检查邮箱是否合法的例子。我们可以通过组合多个函数,从而不需要使用if语句。(今天用一个前端的demo来举个例子,让前端的同学也能受到些启发,其实后端和前端是一样的,为什么称前端是js,j即代表java,逻辑思想是一致的)

 

js

复制代码

function checkEmail(email) { return compose( isNotEmpty, containsAtSymbol, containsDotAfterAtSymbol )(email); } function compose(...fns) { return function(arg) { return fns.reduceRight((res, fn) => fn(res), arg); }; } function isNotEmpty(str) { return !!str.trim().length; } function containsAtSymbol(str) { return str.includes('@'); } function containsDotAfterAtSymbol(str) { let suffix = str.split('@')[1]; if (!suffix) return false; return suffix.includes('.'); } console.log(checkEmail('example@gmail.com')); // 输出 true

在这个例子中,我们定义了三个函数isNotEmpty、containsAtSymbol和containsDotAfterAtSymbol,它们都返回了一个布尔值。我们使用compose函数将这三个函数串起来,从而组成一个函数式的检查邮箱有效性函数checkEmail。使用这种方式,我们不需要使用if语句即可进行流程控制。

我们接下来再看下后端的函数式编程是如何搞得

现在都发展到java17了,如果你还不知道java8的函数式编程,今天你算来着了,我们看下Java 8函数式编程是如何避免if判断的代码,该代码用于验证一个数字是否为偶数

 

java

复制代码

import java.util.function.Predicate; public class Main { public static void main(String[] args) { Predicate<Integer> isEven = n -> n % 2 == 0; System.out.println(isEven.test(2)); // 输出 true System.out.println(isEven.test(3)); // 输出 false } }

在这段代码中,我们使用了Java 8的Predicate函数式接口,它允许我们定义一个布尔型的测试函数,用于测试给定的输入值。

在这个例子中,我们定义了一个isEven谓词,它使用一个lambda表达式判断输入的数字是否是偶数。最后,我们测试了两个数字,并通过test方法调用isEven谓词来验证它们是否为偶数,这样就避免了使用if判断语句。

这就是函数式结合lambda的魅力所在,如果你不了解函数式编程,今天咱们就仔细唠唠,保证让你听的明明白白

二、详解函数式编程

Java 8中的函数式编程是指使用函数式编程范式来编写Java代码。传统的Java编程是面向对象的,重点是定义类、对象及其行为。而函数式编程重点在于函数,函数是第一等公民,可以将其作为参数传递给其他函数,也可以作为返回值返回。Java 8中添加的lambda表达式和函数接口为Java带来了真正的函数编程能力。

那接着又同学问了 ,lambda表达式讲讲呗,虽然大家每天都在用,但是再多啰嗦几句吧

Lambda

Lambda表达式是一个函数式编程中的概念,可以将其看做是一个匿名函数。它可以传递给其他函数使用,也可以作为返回值返回。Java 8中引入的Lambda表达式使用简单的语法来表达函数,例如:

 

java

复制代码

(x, y) -> x + y

这是一个简单的lambda表达式,它接收两个参数并将它们相加。上面我们提到lambda表达式和函数接口为Java带来了真正的函数编程能力。那什么是函数接口呢

函数接口

Java中的函数接口定义了一个只含有一个抽象方法的接口,这种接口也称为SAM接口,即单抽象方法接口(Single Abstract Method interface)。函数接口可以被lambda表达式实现,并作为函数参数或返回值进行传递。

Java 8中定义了一些通用的函数接口,例如Consumer、Predicate、Supplier和Function等,它们分别对应消费、谓词、提供和函数这四种函数类型。

我分别举例说明Consumer、Predicate、Supplier和Function的使用方法。

Consumer

Consumer代表一个接收单个输入参数且没有返回值的操作。它常用于需要执行某个操作,但无需返回值的场合。

例如,在下面的代码中,我们定义了一个printName方法,该方法使用Consumer来接收一个字符串参数,并将该参数打印到控制台。

 

java

复制代码

import java.util.function.Consumer; public class Main { public static void main(String[] args) { Consumer<String> print = name -> System.out.println(name); print.accept("Tom"); // 输出 "Tom" } }

在这个例子中,我们定义了一个Consumer,它接收一个字符串类型的参数并将其打印到控制台。然后我们使用了accept方法来调用这个Consumer。

Predicate

Predicate代表一个断言,即对输入参数进行判断并返回一个布尔值。它常用于做一些条件判断。

例如,在下面的代码中,我们定义了一个isEven谓词,它使用lambda表达式判断输入的数字是否是偶数。

 

java

复制代码

import java.util.function.Predicate; public class Main { public static void main(String[] args) { Predicate<Integer> isEven = n -> n % 2 == 0; System.out.println(isEven.test(2)); // 输出 true System.out.println(isEven.test(3)); // 输出 false } }

在这个例子中,我们定义了一个Predicate,它使用一个lambda表达式判断输入的数字是否是偶数。然后我们测试了两个数字,并通过test方法调用isEven谓词来验证它们是否为偶数。

Supplier

Supplier代表一个无参数且有返回值的操作。它常用于需要提供某些资源的场合。

例如,在下面的代码中,我们定义了一个generateRandom提供者,它使用java.util.Random类生成一个随机数并返回。

 

java

复制代码

import java.util.Random; import java.util.function.Supplier; public class Main { public static void main(String[] args) { Supplier<Integer> generateRandom = () -> new Random().nextInt(100); int randomNum = generateRandom.get(); System.out.println(randomNum); } }

在这个例子中,我们定义了一个generateRandom提供者,它使用Random类来生成一个随机数,并使用get方法来获取该提供者的返回值。

Function

Function代表一个包含一个输入参数和一个返回值的操作。它常用于需要对输入值进行转换或处理的场合。

例如,在下面的代码中,我们定义了一个strLength函数,它使用一个lambda表达式获取一个字符串的长度。

 

java

复制代码

import java.util.function.Function; public class Main { public static void main(String[] args) { Function<String, Integer> strLength = str -> str.length(); System.out.println(strLength.apply("abcde")); // 输出 5 } }

在这个例子中,我们定义了一个strLength函数,它使用一个lambda表达式获取一个字符串的长度。然后我们使用了apply方法来调用这个函数,返回一个字符串的长度。

以上四个函数接口分别代表了消费、谓词、提供和函数这四种函数类型。它们都是Java 8中函数式编程的重要组成部分,可以用来简化代码,提高代码的可读性和可维护性。

我们接着再讲一个函数式编程里面一个比较重要的流式编程。

流式编程

Java 8中的流式编程是指可以将一系列操作以流的方式进行传递和处理。流是一个支持串行和并行操作的数据元素序列。流具有如下的特点:

  1. 操作可以分为中间操作和终止操作两种类型
  2. 操作不会修改源数据,而是产生一个新的流
  3. 操作可以由多个流式操作组成

使用流可以消除许多传统Java编程中的复杂性,使代码更加简洁明了。以下是一个计算数字平方和的简单示例:

 

java

复制代码

import java.util.stream.IntStream; public class Main { public static void main(String[] args) { int sum = IntStream.of(1, 2, 3, 4, 5) .map(n -> n * n) .sum(); System.out.println(sum); // 输出 55 } }

在这个示例中,我们使用了IntStream构造函数创建了一个新的整数类型流,并通过map方法将流中的每个元素平方。最后,我们使用sum方法计算了所有元素的平方和。使用流的方式可以大大简化代码,使代码更加清晰易读。

Java 8中的函数式编程为Java的发展带来了重要的变革和新功能。使用lambda表达式、函数接口和方法引用等特性可以使代码更加简洁易读,同时流式编程也让复杂的数据处理变得容易和高效。

总结

上面我们通过如何规避if/else 讲到了函数式编程,接着讲到了函数接口,将这些慢慢实践到你的项目里面,绝对让你的代码逼格再上一个台阶。

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

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

相关文章

基于apache paimon实时数仓全增量一体实时入湖

用例简介 Apache Paimon&#xff08;以下简称 Paimon&#xff09;作为支持实时更新的高性能湖存储&#xff0c;本用例展示了在千万数据规模下使用全量 增量一体化同步 MySQL 订单表到 Paimon明细表、下游计算聚合及持续消费更新的能力。整体流程如下图所示&#xff0c;其中 …

R语言实践——rWCVP:世界维管植物名录的R包

rWCVP&#xff1a;世界维管植物名录的R包 介绍1. 参照github安装与简单例子1.1 安装rWCVP1.2 安装rWCVPdata1.3 github的例子 2. rWCVP原始文献阅读2.1 前言&#xff08;背景&#xff09;2.2 功能概要2.2.1 名称匹配&#xff08;wcvp_match_names(), wcvp_match_exact(), wcvp …

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络安全新定义

ChatGPT&#xff1a;你真的了解网络安全吗&#xff1f;浅谈网络安全攻击防御进行时 网络安全新定义总结 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序&#xff0c;是人工智能技术驱动…

在字节跳动做了6年测试,5月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是6年的工作经验吧。 这6年之间完成了一次…

API接口测试—详情版(拼多多根据ID取商品详情)

一、为什么要做接口测试 做接口测试的原因主要有以下几个方面&#xff1a; 1. 确保接口功能正确性&#xff1a;接口是不同软件系统或者不同模块之间的数据传输和交互的通道&#xff0c;通过接口测试能够确保不同系统或者模块之间传递的信息准确无误&#xff0c;从而保证了整个…

微信小程序点击icon实现分享功能

1.小程序分享功能实现方式 小程序分享功能有两种方式&#xff0c;监听用户点击页面内转发按钮&#xff08; 组件 open-type“share”&#xff09;或右上角菜单“转发”按钮的行为&#xff0c;并自定义转发内容。 使用微信小程序的分享功能需要定义onShareAppMessage(Object obj…

Java基础 变量与数据类型

变量 为什么需要变量 一花一世界&#xff0c;如果把一个程序看做一个世界或一个社会的话&#xff0c;那么变量就是程 序世界的花花草草、万事万物。即&#xff0c;变量是程序中不可或缺的组成单位&#xff0c;最基 本的存储单元。 初识变量 变量的概念 内存中的一个存储区域…

工作几年,涨薪4K遭拒,后一天我就裸辞走了···

19年7月大学毕业&#xff0c;当时学的计算机科学专业。因为考研之后&#xff0c;秋招结束了。也没什么更多的岗位选择&#xff0c;就想着找个工作先干着&#xff0c;刚好有个亲戚在一家大厂公司上班说要招测试&#xff0c;所以就来做测试了。 虽然都是属于计算机大类&#xff0…

chatgpt赋能Python-python_nor

了解Python NOR 在Python编程语言中&#xff0c;NOR运算是一种逻辑运算符&#xff0c;用于反转两个变量的逻辑值。它是布尔运算中的一种&#xff0c;通常用于检查两个条件是否都不成立。 NOR运算有两个输入和一个输出&#xff0c;当输入为空或两个输入都为False时&#xff0c…

nuxt视频播放(踩坑)

展示效果&#xff1a; nuxt样例视频 1.安装vue-video-player插件 ①执行命令 npm i vue-video-player 或者 npm i vue-video-player5.0.2 后者直接安装对应版本号的插件 ②安装完之后 执行npm i ③安装不对应的版本会报错 ④注意安装版本 不是vue3.0的 请安装&#xff08;“v…

【nginx】同一接口有时返回500(client_body_temp)

问题描述&#xff1a; 同一个接口&#xff0c;有能正常访问并返回的&#xff0c;有的访问未到服务器直接返回500。 查看nginx日志&#xff08;error.log&#xff09;&#xff0c;发现open() "/nginx/client_body_temp/0000476534" failed (13: Permission denied)报…

java的URL类

文章目录 1. 简介2. 创建URL3. 从URL获取数据4. 分解URL5. 相等性和比较 1. 简介 java.net.URL类是对统一资源定位符的抽象。它扩展了Object类&#xff0c;是一个final类&#xff0c;不能对其派生子类。它不依赖于继承来配置不同的URL实例&#xff0c;而使用了策略设计模式&am…

VivadoIO约束

VivadoIO约束 FPGA开发离不开IO约束和时序约束&#xff0c;IO约束用于确定输入/输出端口的物理端口和电气特性&#xff0c;与芯片和电路设计有关。而时序约束则用于设定FPGA设计中的时序特性&#xff0c;以确保系统能够在预期时钟频率下正常运行。本文将介绍vivado中常见的设置…

编码踩坑——Redis Pipeline中调用Lua脚本报错JedisMoveDataException的问题 / Lua脚本常遇到的问题

本篇记录使用Redis Pipeline时&#xff0c;调用redis.clients.jedis.PipelineBase#eval时&#xff0c;报错JedisMoveDataException的问题&#xff1b;通过查看源码发现问题的原因&#xff0c;通过jedis在Github的issue了解了解决方案&#xff1b;涉及知识&#xff1a;Redis slo…

FP独立站支付问题你还没解决?out了!

目前FP独立站是很多跨境卖家的变现方式&#xff0c;但是这类外贸电商会遇到一些收款问题&#xff0c;这些问题很容易就让卖家的资金被冻结、账号被风控、关联账号被限制&#xff0c;损失真是不小。那FP卖家的收款问题该怎么解决呢&#xff1f;往下看。 一、FP独立站常见收款方式…

抖音账号运营技巧,让你的短视频更火爆

抖音是目前最火爆的短视频平台之一&#xff0c;拥有着庞大的用户群体和广阔的市场前景。在这个平台上&#xff0c;每天都有大量的用户在发布自己的短视频内容&#xff0c;让自己的账号脱颖而出并吸引更多的粉丝&#xff0c;成为每个用户所追求的目标。下面就来介绍一些抖音账号…

新用户如何选择WMS仓储管理系统解决方案

引言&#xff1a;随着现代化物流技术的不断发展&#xff0c;WMS仓储管理系统已成为企业管理的重要工具。一款合适的WMS系统可以帮助企业提高库存管理效率、减少库存成本、提升物流服务质量。对于初学者来说&#xff0c;如何选择适合自己的WMS系统&#xff0c;往往是一项挑战。本…

如何做好app的测试工作?一文6个步骤到你秒变APP测试高手

先说结论: 想要做好 APP 的测试工作, 离不开相对完整的测试要点! 本篇文章不仅有完整的App测试介绍&#xff0c;还有相对完整的App测试视频分享。 闲话少叙, 咱们直奔主题, APP 应用测试应该主要包含以下几个方面的测试要点: 需要注意的是: APP 应用测试是个相对繁杂的测试类…

电脑远程连接软件推荐

您可以考虑使用多种可靠的计算机远程连接软件选项来远程连接和控制计算机。 以下是一些流行的选项&#xff1a; TeamViewer TeamViewer 是一种广泛使用的远程访问软件&#xff0c;以其易用性和跨平台兼容性而闻名。 它提供远程控制、文件传输和桌面共享等功能。 TeamViewer 通…

解密JavaScript混淆加密技术:揭秘隐藏的代码之谜

让我们通过一个案例来更好地理解JavaScript混淆加密的工作原理。假设我们有以下原始的JavaScript代码&#xff1a; function addNumbers(a, b) {return a b; }上述代码非常简单易懂&#xff0c;但对于一些恶意攻击者来说&#xff0c;他们可能会试图窃取您的代码或者修改其中的…