跟着JHipster学做项目 (11) stream和Optional的使用

Spring Boot 3.4.2 @Controller 与 @RestController 实战对比:3种场景下的选择指南 本文深入对比Spring Boot 3.4.2中@Controller与@RestController的核心差异,通过三种典型场景(传统MVC页面、RESTful API和混合架构)的实战示例,帮助开发者根据项目需求做出合理选择。重点解析注解工作原理、性能差异及最佳实践,提升Web应用开发效率。 阅读详情

JHipster在java代码中大量运用stream和Optional,使得代码简洁,运行效率高,下面总结了一些用例,基本涵盖了我们项目日常遇见的需求。

repository.findById(id).orElseThrow(() -> new BadRequestAlertException("error message!", null,"error_type"));

Optional.ofNullable(entity.getValue()).orElse(""))

Collectors的使用

List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

查询当前用户id

String userId = SecurityUtils.getCurrentUserLogin().map(userRepository::findByUserName).map(Optional::get)
				.map(ApplicationUser::getId).get();

在数据库中查询用户,如果存在,利用数据库查询结果计算并返回,若不存在抛出异常(或返回其它结果)。

public UserDetails loadUserByUsername(final String login) {
    return userRepository.findOneByLogin(lowercaseLogin)
            .map(user -> createSpringSecurityUser(lowercaseLogin, user))
            .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " 
    was not found in the database"));
}

private org.springframework.security.core.userdetails.User createSpringSecurityUser(String lowercaseLogin, User user) {
    return new org.springframework.security.core.userdetails.User(user.getLogin(),
            user.getPassword(),
            grantedAuthorities);
}

根据当前登录用户名称进行数据库查询,若存在,对用户信息进行更新。

        SecurityUtils.getCurrentUserLogin()
            .flatMap(userRepository::findOneByLogin)
            .ifPresent(user -> {
                user.setFirstName(firstName);
                user.setLastName(lastName);
                if (email != null) {
                    user.setEmail(email.toLowerCase());
                }
                user.setLangKey(langKey);
                user.setImageUrl(imageUrl);
                userRepository.save(user);
                this.clearUserCaches(user);
                log.debug("Changed Information for User: {}", user);
            });

根据字符串列表中的字符串进行数据库查询,以数据库查询结果创建新的对象列表

userDTO.getAuthorities().stream()
    .map(authorityRepository::findById)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .forEach(managedAuthorities::add);

仅当数据库查询用户存在时,清空缓存,并返回用户传输对象。

Optional.of(userRepository
            .findById(userDTO.getId()))
            .filter(Optional::isPresent)
            .map(Optional::get)
            .map(user -> {
                this.clearUserCaches(user);
                return user;
            })
            .map(UserDTO::new);

另外,在controller中大胆使用Optional作为返回对象,前端无需做任何特殊处理。

UserResource:

    @GetMapping("/users/{login:" + Constants.LOGIN_REGEX + "}")
    public ResponseEntity<UserDTO> getUser(@PathVariable String login) {
        log.debug("REST request to get User : {}", login);
        return ResponseUtil.wrapOrNotFound(
            userService.getUserWithAuthoritiesByLogin(login)
                .map(UserDTO::new));
    }

UserService:

    public Optional<User> getUserWithAuthoritiesByLogin(String login) {
        return userRepository.findOneByLogin(login);
    }

Good Luck,

Cheers!

你还在统一返回 ApiResult 吗?duck 不必,快来看 API 错误处理的最佳实践 为什么写这篇文章? 相信不少 Java 开发都在项目中使用过类似 ApiResult 这样的对象来包装 Api 返回类型,这相比什么都不包装有一定的好处,但这真的就是最好的做法吗? 其实统一封装 ResultBean 实际上也是一种重复工作,秉承 DRY 的理念,还有必要对其继续优化。 统一返回 ApiResult 还不是最佳实践,必须不断思考优化,就像 React 所提倡的 Rethinking Best Practices 。 ApiResult 现状 我们先看一个常见的 ApiResult 对象,代 阅读详情

相关推荐

Java8中Optional类入门-替代null避免冗杂的非空校验

上面在讲Guava时讲过Optional,下面做具体的入门示例讲解。构建一个关系人-购买车-车买保险的关系类如上。如果需要获取保险的名称可能需要做多重非空校验,如果person不为空,则调用person的getCar获取car对象,如果car不为空,获取car的保险insurance,如果保险不为空,则获取保险名称。

BADAO_LIUMANG_QIZHI的博客 1362

RESTful 简介

REST(Representational State Transfer)是一种通过 HTTP 协议进行通信的软件架构风格,常用于 Web 应用程序的设计和开发。RESTful 是遵循 REST 原则的 Web API 的称谓,它提供了一组定义良好的操作(如 GET、POST、PUT、DELETE 等),通过这些操作对资源(如文件、图像、视频等)进行管理。

salahi的专栏 987

UE4 GamePlay框架深度解析:从蓝图到C++构建多人游戏核心

在游戏开发与实时交互应用领域,一套清晰、可扩展的底层框架是项目成功的关键。GamePlay框架作为虚幻引擎(UE4/UE5)的核心架构,定义了游戏世界中对象交互、状态管理与网络同步的基本原理。它通过职责分离的设计模式,将游戏规则(GameMode)、全局状态(GameState)、玩家状态(PlayerState)、可操控实体(Pawn/Character)及其控制器(Controller)等核心类有机组织起来,确保了逻辑的清晰性与多人游戏数据的一致性。其技术价值在于为开发者提供了一套经过验证的最佳实践,大

weixin_33924770的博客 612

【笔记55】明智审慎地返回 Optional

  在 Java 8 之前,编写在特定情况下无法返回任何值的方法时,可以采用两种方法。要么抛出异常,要么返回 null(假设返回类型是对象是引用类型)。但这两种方法都不完美。应该为异常条件保留异常 (详见第 69 条),并且抛出异常代价很高,因为在创建异常时捕获整个堆栈跟踪。返回 null 没有这些缺点,但是它有自己的缺陷。如果方法返回 null,客户端必须包含特殊情况代码来处理 null 返回的...

u013773608的博客 580

固定翼飞行器建模(一)——六自由度动力学

前两期文章讲完了气动力和气动力矩的模型,本期将来讲解一下六自由度部分的动力学与运动学方程。

2302_80148937的博客 1万+

从零构建FOC:手把手教你实现无刷电机磁场定向控制

本文是一份详尽的FOC(磁场定向控制)实战教程,指导开发者从零开始构建无刷电机驱动系统。文章深入解析了FOC的核心算法,包括坐标变换(Clarke/Park)、SVPWM调制和双环PI控制,并对比了有感与无感方案的实现差异。通过分步调试指南,帮助读者亲手实现稳定、高效的无刷电机控制,彻底掌握其底层原理。

h3i4j的博客 514

Java8新特性 - Optional类

转自:https://my.oschina.net/wangzhenchao/blog/751150 摘要: Optional不是对null关键字的一种替代,而是对于null判定提供了一种更加优雅的实现 Java8新特性系列 Java8新特性(一) - lambda表达式Java8新特性(二) - Optional类Java8新特性(三) - 流式数据处理Java8新特性(四

Reid的专栏 868

深入了解 CPU 的型号、代际架构与微架构!

深入了解 CPU 的型号、代际架构与微架构!

欢迎朋友,我是一名十多年开发经验的新手,希望多多指教。 3195

java8之optional 和isPresent()

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional 类的引入很好的解决空指针异常。

weixin_55853065的博客 9768

【Frida Android】实战篇4:SSL Pinning 证书绑定绕过 Hook 教程(一)

在前两章中,我们学习了中间人抓包与 Hook 抓包的基础方法,这些方法在理想环境下能够有效获取网络请求数据。但在实际的企业级应用中,出于安全防护需求,很多 APP 会启用证书绑定(SSL Pinning)机制。这种机制会让客户端对服务器证书的校验更为严格,导致常规的抓包方法(即使将 BurpSuite/Charles 证书安装到系统信任区)也无法生效。因此,从本章开始,我们将系统学习 SSL Pinning 机制的绕过技术。SSL Pinning(证书绑定)是客户端校验服务器身份的进阶安全机制。

水滴石穿 1610

apache 403错误 Forbidden解决方法

当网页打开提示以下错误时,即出现了403错误。 Forbidden You don't have permission to access / on this server. 403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。通常情况可能(但不限于此)的原因有: 原因1:apache配置文件中没有对站点目录的权限许可,这通...

lmseo5hy的博客 1494

java stream optional_java成神之——Stream和Optional

Stream流基本使用Stream myStream = Stream.of("a", "", "b", "c", "d");myStream.filter(item -> item!="").map(String::toUpperCase).sorted().forEach(System.out::println); // ABCD使用流注意点:如果一个流没有调用终端方法,那么流的其他操作...

weixin_31221157的博客 551

把 OData V4 服务真正发布出去:事务码 /IWFND/V4_ADMIN 在 SAP S/4HANA On-Premise 里的定位与用法

本文介绍了SAP S/4HANA中的事务码/IWFND/V4_ADMIN,这是SAP Gateway管理OData V4服务的关键工具。该事务码主要负责将后端注册的OData V4服务以服务组形式发布到前端,并维护系统别名路由、测试入口和日志跳转。与OData V2不同,V4采用服务组概念以支持跨服务导航,类似商场统一管理多个专柜。文章还通过实际案例说明,未发布服务组会导致BAS等工具无法发现OData V4服务,并提供了验证服务组状态的访问路径和ABAP示例代码。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 205

如何使用Optional<T> findById(ID id);

提供了依赖于是否存在所包含值的其他方法,例如 orElse() (如果值不存在,则返回默认值)和 ifPresent() (如果值存在,则执行代码块)。可能包含也可能不包含非空值的容器对象。如果存在一个值,则 表示() 将返回 true,get() 将返回该值。通常,当您按 id 查找实体时,您希望返回它或进行特定处理(如果未检索到)。我总是在广泛使用的Crud存储库存储库/接口中编写默认方法。以下是三个经典用法示例。

allway2的博客 1682

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JPA中findById()的用法

今天使用jpa踩了个坑,发现findById的用法与普通的find函数有些许区别: Obj obj=objRepository.findById(id).orElse(new Obj ());

weixin_43591137的博客 4802

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java optional 用法_Java8 中的 Optional 相关用法

基本方法:of()为非 null 的值创建一个 Optional 实例isPresent()如果值存在,返回 true,否则返回 falseget()返回该对象,有可能返回 null应用场景:1> 默认值传统方式public static String getName(User u) {if (u == null)return "Unknown";return u.name;}杜绝使用...

weixin_33356544的博客 452

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SpringBoot2.0 (Spring-Data-Jpa) findById(findOne())和Optional<T>的使用:

本文主要介绍升级SpringBoot2.0之后,之前使用的findOne()方法的替代方法findById()方法的使用,以及Optional<T>的使用。 1、findOne()方法的替代方法findById() 2.0版本,Spring-Data-Jpa修改findOne()。 1)2.0版本之前 T findOne(ID primaryKey); 2)2.0版本...

qq_41088384的博客 1万+

Java Stream操作详解及示例

一个流可能很长,甚至是无限的,如果不需要继续对其进行处理,我们希望可以直接终止操作,而不是等到处理完所有元素。通过使用flatMap()方法,字段PARTS中的每一个元素都被提取出来并添加到新的结果流中,之后,初始的Stream会被丢弃。可以看到上面的tryAdvance()方法,自定义的拆分器处理了装饰的拆分器中的元素,只要断言为真并且初始流中还有元素,就会一直进行处理;如果需要对集合中的元素进行排序,可以使用Stream中的sorted方法,该方法接收一个Comparator接口的实现类作为参数。

muranchenhui的博客 4368

Java8:使用 Optional 处理 null(1)

上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。很多人担心学了容易忘,这里教你一个方法,那就是重复学习。打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

2401_84407867的博客 823

Optional的使用(代替if判断是否为空)

Optional 就相当于是一个对象容器。

m0_59176231的博客 1719

java 读取一组数_java – 如何从一组选项中获取数据?

Java 8List expiredGuarantees = getProducts().stream().map(Product::getGuarantee).filter(Optional::isPresent).map(Optional::get).filter(not(Guarantee::hasExpired)).collect(toList());Java 9Java9有Optiona...

weixin_42466331的博客 364

spring security简介与使用

spring security spring security使用目的:验证,授权,攻击防护。 原理:创建大量的filter和interceptor来进行请求的验证和拦截,以此来达到安全的效果。 新建一个springboot项目 创建一个springboot项目,添加一个/helloController @RestController public class HelloController { @RequestMapping("/hello") public String h

fcclzydouble的博客 2356

JDK8新特性(四):Optional 类的使用

Optional类的使用 JDK8以前,编写代码,通常会出现 NullPointerException (空指针异常),通常情况下我们都是通过 if ... else... 来对对象进行为空判断,然后再进行逻辑处理,代码写起来也比较冗余。 JDK8新增了Optional类,使用该类可以避免我们对空指针的检查,使代码看起来比较优雅。 1.Optional类介绍 ...

扛麻袋的少年的博客 6953

JAVA8 - Optional中map和flatMap的区别

map中获取的返回值自动被Optional包装,即返回值 -&gt; Optional&lt;返回值&gt; flatMap中返回值保持不变,但必须是Optional类型,即Optional&lt;返回值&gt; -&gt; Optional&lt;返回值&gt; eg: class FlightTicketInfo { private String orderNumber; ...

大白能的博客 4万+

工具类四:ResponseUtil

public class ResponseUtil { public static void write(HttpServletResponse response,Object o)throws Exception{ response.setContentType("text/html;charset=utf-8"); PrintWriter out=respo

众人皆醉,唯我独醒 6900
上一篇: 跟着JHipster学做项目 (10) 缓存的应用
下一篇: 跟着JHipster学做项目 (12) 分页处理(上)后端利用Pageable进行分页查询
java_augur
博客等级 码龄22年 67粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值