热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java流是否仅打算用于数组?单个元素呢?

我一直在研究Java流和函数式编程。想出了一种重写小的“用户登录”代码

我一直在研究Java流和函数式编程。
想出了一种重写小的“用户登录”代码的方法。

这是我的登录方法;
如果来自查询的用户为null,则在过滤器上处理null指针异常。

public ResponseEntity login(User request) {
User dbUser = userRepo.findByEmail(request.getEmail());
if (!aes.matches(request.getPassword(),dbUser.getPassword()))
return ResponseEntity.status(403).build();
return logUserIn(dbUser);
}
private ResponseEntity logUserIn(User dbUser) {
dbUser.setPassword(null);
jwtHandler.setJwtCOOKIE(dbUser);
return ResponseEntity.ok(dbUser);
}

并通过使用流;

public ResponseEntity login(User request) {
return Stream.of(userRepo.findByEmail(request.getEmail()))
.filter(dbUser -> aes.matches(request.getPassword(),dbUser.getPassword()))
.map(this::logUserIn)
.findFirst()
.orElse(ResponseEntity.status(403).build());
}
private ResponseEntity logUserIn(User dbUser) {
dbUser.setPassword(null);
jwtHandler.setJwtCOOKIE(dbUser);
return ResponseEntity.ok(dbUser);
}

我不知道是否要以这种方式使用流。是吗?
如果我在项目的重要部分使用类似的逻辑,以后会遇到麻烦吗?


如果您以更实用的方式使用if-else而不是短路它,则可能会感觉更好:

if (!aes.matches(request.getPassword(),dbUser.getPassword())) {
return ResponseEntity.status(403).build();
}
else {
return logUserIn(dbUser);
}

使用Stream / Optional在一条语句中执行等效操作较难阅读且性能较差。

您可能会考虑使findByEmail返回Optional的可能性,这对于任何“查找”方法来说都是惯用的。然后,您可以将两种方法结合起来

return userRepo.findByEmail(request.getEmail()).map(dbUser -> {
if (!aes.matches(request.getPassword(),dbUser.getPassword())) {
return ResponseEntity.status(403).build();
}
else {
return logUserIn(dbUser);
}
})... // .orElse(null) / .orElseThrow(...)

,

大多数情况下,您会遇到麻烦。 “根本”的问题是,两种写法都可以作为“最佳选择”来辩护,并且Java社区总体上强烈倾向于第二种形式。出于同样的原因,name_variables_like_this是个坏主意(社区决定约定为nameThemLikeThis)。打破常规将意味着您的代码很难被他人阅读,而他人编写的代码对于您来说则更难阅读。另外,当您尝试与其他代码进行交互时,您可能会遇到摩擦。

例如,现在(以及可预见的将来),“ lambdas”(带有::->的东西)不是异常透明的,不是控制流透明的,也不是可变的局部变量透明。

这里只有3种可行的选择:


  1. 以某种方式编写所有代码,以使这3个透明胶片与从不相关,无论您要编写什么内容。这对我来说听起来是不可能的。即使您以某种方式进行管理,也存在其他库。从java.*开始,它不是为那种代码风格设计的。


  2. 混合代码样式,如果您没有立即看到透明胶片是相关的,则使用lambda样式;否则,则使用更为必要的样式(如果您认为可能)。这对我来说听起来很愚蠢。当一个样式可以涵盖所有用例时,为什么要混合两种样式?


  3. 以lambda样式粘贴,向后弯曲以解决这3个透明胶片所困扰的问题,将其“降级”为AtomicX变体,并使用此类构造将异常和布尔标志传递给进行休息并继续控制外部等植物的流动。这只是编写丑陋的代码,只是因为您特别迷恋上了崭新的闪亮锤子,并且坚持要把所有问题都当作钉子,不是吗?


那是..试图猜测当您与其他代码和其他程序员进行交互时会发生什么。这个片段,在真空中,只有你吗?嗯,都很好。无论您喜欢哪个社区,与其他代码的摩擦以及保持一致的样式都无关紧要。

,

我在实时代码中使用了Java 8流,对我来说最大的缺点是,当管道中未处理异常时,您将获得堆栈跟踪。

确保它们很好编写,并给您以功能风格编写代码的感觉,但事实是流只是一个外观,因为在精美的API下,您正在处理纯净,丑陋的巨大抽象层Java迭代器,当出现问题(例如未处理异常)时,这变得非常痛苦。

因此,您的问题的答案是是的,您可能会遇到麻烦,但这取决于您对堆栈跟踪的了解程度,其中70%的跟踪与您编写的代码无关已经写过,但是写了一些神奇的东西,用来将迭代器变成流。

尽可能使用if-elsefor-loops等,除非您确信流将更高效或更易于阅读。值得注意的是,可读性非常重要,Stream API的存在的部分原因是为了提高可读性,但是在充分利用潜力的同时,节制和良好的判断是值得实践的优点。流API。


推荐阅读
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • python3 logging
    python3logginghttps:docs.python.org3.5librarylogging.html,先3.5是因为我当前的python版本是3.5之所 ... [详细]
  • php设置数组大小_【大厂必备】2020超经典PHP面试题
    结合我自己这段时间的面试情况,面对的一些php面试题列举出来,基本上结合自己的看法回答的,不妥的地方请大家指出去,与大家一起 ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
author-avatar
dfpkgih
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有