如何使用Java 8编写instanceof?

3

我是Java 8 Optional的新手。我需要修改以下代码:

@RequestMapping(value = "/account",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<UserDTO> getAccount() {
    return 
        Optional.ofNullable(userService.getUserWithAuthorities())
        .map(user -> 
            new ResponseEntity<>(
                new UserDTO(
                    user.getLogin(),
                    null,
                    user.getFirstName(),
                    user.getLastName(),
                    user.getEmail(),
                    "",
                    user.getLangKey(),
                    user.getAuthorities()
                        .stream()
                        .map(Authority::getName)
                        .collect(Collectors.toList())
                ),
                HttpStatus.OK
            )
        )
        .orElse(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
}

我希望根据user的实例创建不同的ResponseEntity。以下是等价代码:

if(user instanceof Admin )
{
// my logic
}
else if(user instanceof NormalUser)
{
// my logic
}

谢谢

2个回答

5
你可以这样做:

你需要像这样操作:

@RequestMapping(value = "/account",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<UserDTO> getAccount() {
        return Optional.ofNullable(userService.getUserWithAuthorities())
            .map(user -> {
                if (user instanceof Admin) {
                    //...
                }
                return new ResponseEntity<>(new UserDTO(...), HttpStatus.OK);
            })
            .orElse(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
    }

然而,如果可以的话,请避免使用instanceof运算符。在你的User类中添加一个isAdmin方法:在Admin类中,它将返回true,而在NormalUser类中,它将返回false


0

你的方法是正确的。不过,你需要将u转换为你想要的类型。

if (u instanceof Admin) {
    Admin a = (Admin) u;
    // your logic
}

我可以在新的ResponseEntity中添加这个逻辑吗? - Pracede
是的,那将替代UserDTO构造函数调用的位置。 - bb94
@Pracade 是的,你可以。 - bb94

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接