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

22 篇文章 14 订阅
16 篇文章 1 订阅

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!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值