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

这篇具有很好参考价值的文章主要介绍了不需要策略模式也能避免满屏if/else。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

满屏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,那你是真强

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

今天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的魅力所在,如果你不了解函数式编程,今天咱们就仔细唠唠,保证让你听的明明白白

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

二、详解函数式编程

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

总结

上面我们通过如何规避if/else 讲到了函数式编程,接着讲到了函数接口,将这些慢慢实践到你的项目里面,绝对让你的代码逼格再上一个台阶。文章来源地址https://www.toymoban.com/news/detail-458461.html

到了这里,关于不需要策略模式也能避免满屏if/else的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之【策略模式】,去掉繁琐的if-else,实现算法的动态替换

    全网最全最细的【设计模式】总目录,收藏起来慢慢啃,看完不懂砍我 策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),它是将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。属于行为型模式。 策略模式使用

    2024年02月09日
    浏览(44)
  • Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

     前言:在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿,这边我就举一个我在实际开发中的例子,来进行阐述这两种模式在实际开发中我是如何运用的。 目录 一、工厂模式简介 二、简单工厂模式 2.1、UML类图

    2024年02月15日
    浏览(34)
  • 设计模式:干掉if else的几种方法

    存在的问题: 如果业务逻辑过多 if else 可能要写多达几百行,这样代码可读性很差,不利于寻找bug和理解代码 如果if后面的判断逻辑过长,则代码可读性不强 如果将其写在一个核心代码里面,则新增功能时需要修改核心代码,要是不小心改到其他的代码就凉凉了 当业务逻辑

    2024年02月07日
    浏览(41)
  • C++类模板实现工厂模式(优化if else/switch case)

    引自:https://blog.csdn.net/weixin_43795921/article/details/127224633 template typename IdentifierType, class AbstractProduct, class ProductCreator = AbstractProduct *(*)(), class MapContainer = std::mapIdentifierType, ProductCreator class Factory { public: bool Register(const IdentifierType id, ProductCreator creator) { return producers_.insert(std::make

    2024年02月13日
    浏览(55)
  • 【状态模式】拯救if-else堆出来的屎山代码

    我想大家平时都在开发重都遇见过屎山代码,这些屎山代码一般都是由于复杂且庞大的if-else造成的,状态模式,是一种很好的优化屎山代码的设计模式,本文将采用两个业务场景的示例来讲解如何使用状态模式拯救屎山代码。 目录 前言 1.网购业务场景 1.1.需求 1.2.if else的实

    2024年02月12日
    浏览(40)
  • springboot工厂模式解决if_else流程和问题点解决

    spring中的Bean由IOC容器进行管理,和普通工厂的区别就是springboot中的类不能通过自己New出来使用,如果通过new写入到工厂,涉及到相关实现类调用其他Service(该service在正确情况下正常注入),注入的Service也会报错异常Null,也就是工厂注入失败。 工厂中的相关Bean也通过Spring

    2023年04月09日
    浏览(65)
  • 设计模式第八讲:常见重构技巧 - 去除多余的if else

    最为常见的是代码中使用很多的if/else,或者switch/case;如何重构呢?方法特别多,本文是设计模式第八讲,带你学习其中的技巧。 通常业务代码会包含这样的逻辑:每种条件下会有不同的处理逻辑。比如两个数a和b之间可以通过不同的操作符(+,-,*,/)进行计算,初学者通

    2024年02月10日
    浏览(41)
  • 实际开发中常用的设计模式--------策略模式(知识跟业务场景结合)-----小白也能看懂(通俗易懂版本)

    1.策略模式定义: 策略模式是一种行为型设计模式,它允许在运行时动态地改变对象的行为。策略模式将将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换从而使得算法的变化不会影响到客户端 2.简单的策略模式示例代码: 在上述代码中,SortStra

    2024年02月13日
    浏览(51)
  • 【自学Java】Java if else-if else语句

    在 Java 语言 中, if 是用于测试某个条件( 布尔型 或逻辑型)的语句是否满足一定的条件,如果满足特定的条件,则会执行 if 后由大括号 {} 括起来的代码块,否则就忽略该代码块继续执行后续的代码。 else if 用于在 if 语句条件不满足的情况下,继续执行 else

    2024年02月06日
    浏览(54)
  • vue学习之v-if/v-else/v-else-if

    v-else/v-else-if 创建 demo7.html,内容如下 效果展示

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包