在java8stream表达式中实现if/else逻辑

flydean程序那些事      2022-05-06     755

关键词:

简介

在Stream处理中,我们通常会遇到if/else的判断情况,对于这样的问题我们怎么处理呢?

还记得我们在上一篇文章lambda最佳实践中提到,lambda表达式应该越简洁越好,不要在其中写臃肿的业务逻辑。

接下来我们看一个具体的例子。

传统写法

假如我们有一个1 to 10的list,我们想要分别挑选出奇数和偶数出来,传统的写法,我们会这样使用:

    public void inForEach(){
        List<Integer> ints = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        ints.stream()
                .forEach(i -> {
                    if (i.intValue() % 2 == 0) {
                        System.out.println("i is even");
                    } else {
                        System.out.println("i is old");
                    }
                });
    }

上面的例子中,我们把if/else的逻辑放到了forEach中,虽然没有任何问题,但是代码显得非常臃肿。

接下来看看怎么对其进行改写。

使用filter

我们可以把if/else的逻辑改写为两个filter:

List<Integer> ints = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        Stream<Integer> evenIntegers = ints.stream()
                .filter(i -> i.intValue() % 2 == 0);
        Stream<Integer> oddIntegers = ints.stream()
                .filter(i -> i.intValue() % 2 != 0);

有了这两个filter,再在filter过后的stream中使用for each:

        evenIntegers.forEach(i -> System.out.println("i is even"));
        oddIntegers.forEach(i -> System.out.println("i is old"));

怎么样,代码是不是非常简洁明了。

总结

lambda表达式需要尽可能的简洁,我们可以用stream的filter来替代if/else业务逻辑。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/lambda-if-else

欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com

如何在 PIG Script 中实现 IF ELSE 控制逻辑

】如何在PIGScript中实现IFELSE控制逻辑【英文标题】:HowtoImplementIFELSEcontrollogicinPIGScript【发布时间】:2015-11-2419:37:43【问题描述】:我们需要根据条件执行脚本如果(真)//执行这条语句别的//执行这条语句我听说IFelse不存在,但... 查看详情

在python中实现多分支选择结构的较好方法是

参考技术A(A.ifB.if-elseC.if-elif-else)。C8.下列语句执行后的输出是(if2:)。CD.if嵌套)。DB.notx)。DB.x-6>5B.2<xandx<=10D... 查看详情

Apache Zeppelin 条件分支(IF/ELSE)?

...发布时间】:2021-05-2516:57:51【问题描述】:如何在Zeppelin中实现条件分支?例如IF<condition>THEN<runparagraphA>ELSE<runparagraphB>或者对于Zeppelinnotebo 查看详情

在 Greenplum 中实现公用表表达式

】在Greenplum中实现公用表表达式【英文标题】:MaterializeCommonTableExpressioninGreenplum【发布时间】:2013-03-0901:40:59【问题描述】:有没有办法强制GreenplumPostgreSQL在WITH子句中实现子查询,就像MATERIALIZE和INLINEoptimizerhints在Oracle中执行... 查看详情

在 .NET 4 中实现正则表达式超时

】在.NET4中实现正则表达式超时【英文标题】:ImplementingRegExTimeoutin.NET4【发布时间】:2012-03-1616:02:59【问题描述】:平台:Silverlight4、.NET4在.NET4.5开发人员预览版中,RegEx类已得到增强,允许设置超时值,如果模式匹配出现问题... 查看详情

如何在 postgresQL 查询中实现数学表达式?

】如何在postgresQL查询中实现数学表达式?【英文标题】:HowtoachievemathematicalexpressioninpostgresSQLquery?【发布时间】:2018-07-1215:38:31【问题描述】:我有一种需求,从PostgreSQL数据库表中找出“主余额”。在这里,逻辑同样非常简单... 查看详情

if else条件在Regex c#中并返回常量值

...ingstr="abc"if(str=="abc")return"abc";elsereturn"xyz"我们可以在C#Regex中实现这一点吗?或者另一个条件是,如果输入字符串长度为3,则返回“abc”,否则返回“ 查看详情

在表达式树中实现 Not,.net 4

】在表达式树中实现Not,.net4【英文标题】:ImplementNotinexpressiontrees,.net4【发布时间】:2011-01-1100:35:53【问题描述】:是否可以实现!(不)使用表达式树。我有兴趣创建一个C#eval类,它将解析和评估包含true、false、||、&&... 查看详情

如何在 xpath 表达式中实现具有名称的用户定义函数?

】如何在xpath表达式中实现具有名称的用户定义函数?【英文标题】:HowcanIimplementauser-definedfunctionwithanameinthexpathexpression?【发布时间】:2020-04-1703:08:16【问题描述】:我正在使用XSLT。我知道InlineFunctionExpressions,有没有办法在xpat... 查看详情

如何在 LINQ 中实现“MinOrDefault”?

...发布时间】:2011-01-1101:23:13【问题描述】:我正在从LINQ表达式生成十进制值列表,并且我想要最小的非零值。但是,LINQ表达式完全有可能导致一个空列表。这将引发异常,并且没有MinOrDefault来应对这种情况。decimalresult=(fromItemit... 查看详情

雪花和正则表达式 - 在 SF 中实现已知良好表达式时的问题

】雪花和正则表达式-在SF中实现已知良好表达式时的问题【英文标题】:SnowflakeandRegularExpressions-issuewhenimplementingknowngoodexpressioninSF【发布时间】:2020-09-0211:17:13【问题描述】:我正在寻求有关调试REGEXP_REPLACE()语句的帮助。我一... 查看详情

如何在没有正则表达式的情况下在 C++ 中实现有效的全字字符串替换?

】如何在没有正则表达式的情况下在C++中实现有效的全字字符串替换?【英文标题】:HowcanIimplementanefficientwhole-wordstringreplacementinC++withoutregularexpressions?【发布时间】:2011-05-0920:06:00【问题描述】:也许我忽略了一些显而易见的... 查看详情

正则表达式:如何在 PL/SQL 中实现负向后查找

】正则表达式:如何在PL/SQL中实现负向后查找【英文标题】:Regex:HowtoImplementNegativeLookbehindinPL/SQL【发布时间】:2014-11-1221:34:23【问题描述】:如何匹配所有以loockup.开头并以_id结尾但不以msg为前缀的字符串?下面是一些例子:loo... 查看详情

在 Python 中实现“规则引擎”

...”来匹配和处理日志消息。它需要具有:消息本身的正则表达式匹配消息严重性/优先级的算术比较布尔运算符我设想一个示例规则可能是这样的:(message~"program 查看详情

if..else 自定义模板标签

...间】:2011-12-0903:26:56【问题描述】:我正在我的Django项目中实现一个自定义权限应用程序,但我不知道如何实现一个自定义模板标签,该标签检查登录用户对特定对象实例的权限并显示一段基于检查结果。我现在拥有的是(伪代... 查看详情

在 100 多个文件中实现序列化

...】:【参考方案1】:您可以在IDE中使用查找和替换正则表达式并进行清理,例如将publicclass(.*)替换为publicclass$1i 查看详情

如何在 SQL 中实现 `set field = max(1, x)`?

...间】:2011-08-2418:31:58【问题描述】:我正在尝试使用一个表达式更新一系列记录中的一个字段,该表达式将计算为一个可能为负数的整数。我希望列的下限为1;表达式计算结果小于1的任何行都应将其字段设置为1。这可能最好通... 查看详情

是否可以为 CSS 样式执行 if else ? [复制]

...为50%。对于带有其他宽度,将宽度设置为100%。可以在CSS中实现吗?目前我只能将宽度设置为始终100%。.entry-cont 查看详情