Java中如何从Optional的ifPresent条件作用域内返回处理后的对象
解决方案
你当前无法获取ifPresent内部Foo对象的原因有两点:
ifPresent接收的是无返回值的Consumer函数接口,本身不支持返回处理结果- Lambda表达式内部声明的局部变量作用域仅在Lambda块内,无法直接在外部访问
推荐直接使用Optional的map + orElseThrow链式写法,既符合函数式编程规范,也能直接拿到处理后的Foo实例,同时兼顾用户不存在的异常处理,修改后的代码如下:
@PostMapping("/foo") public ResponseEntity<Foo> createFoo(@Valid @RequestBody Checkout checkout) throws URISyntaxException { Foo foo = userRepository.findById(userId) .map(user -> { Foo _foo = checkout.getFoo(); _foo.setUser(user); return checkoutService.saveFoo(_foo); }) // 用户不存在时抛出异常,可根据业务需求替换为自定义业务异常或者返回404响应 .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "对应用户不存在")); return ResponseEntity .created(new URI("/api/foo/" + foo.getId())) .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, foo.getId().toString())) .body(foo); }
如果你确实需要沿用ifPresent的写法,也可以用AtomicReference包装Foo对象实现值传递,但这种写法不符合函数式设计风格,需要额外做空判断,不推荐使用:
@PostMapping("/foo") public ResponseEntity<Foo> createFoo(@Valid @RequestBody Checkout checkout) throws URISyntaxException { AtomicReference<Foo> fooHolder = new AtomicReference<>(); Optional<User> _user = userRepository.findById(userId); _user.ifPresent( user-> { Foo _foo = checkout.getFoo(); _foo.setUser(user); fooHolder.set(checkoutService.saveFoo(_foo)); } ); Foo foo = fooHolder.get(); // 额外做空判断处理用户不存在的场景 if (foo == null) { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "对应用户不存在"); } return ResponseEntity .created(new URI("/api/foo/" + foo.getId())) .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, foo.getId().toString())) .body(foo); }
内容的提问来源于stack exchange,提问作者dungreact
相关产品推荐
相关产品推荐

