Java 8 可选 <List> 返回 True 为什么?
Java 8 Optional <List> returning True Why?
我有一个 REST 控制器
@GetMapping("/getByClientId/{clientId}")
public ResponseEntity<Optional<List<EquityFeeds>>> getByClientId(@PathVariable("clientId") final String clientId) {
Optional<List<EquityFeeds>> cId = Optional.ofNullable(equityFeedsService.findByClientId(clientId));
System.out.println("Client Id: "+cId);
if(cId.isPresent()) {
return ResponseEntity.ok(cId);
} else {
cId.orElseThrow(() -> new ClientIdNotFoundException(clientId));
}
return ResponseEntity.ok(cId);
}
服务Class代码:
public List<EquityFeeds> findByClientId(String clientId) {
List<EquityFeeds> cId = equityFeedsRedisRepositoryImpl.findByClientId(clientId);
System.out.println("In EquityFeedService "+cId);
return cId;
}
实施。代码(REDIS):
public List<EquityFeeds> findByClientId(String clientId) {
return (List<EquityFeeds>) listOperations.range(clientId, 0, -1);
}
问题:
1) 当使用 REST 控制器调用 getClientId 并且 clientId 不存在于 REDIS 缓存中时:
Service class Code returns: In EquityFeedService []
The REST Controller returns: Client Id: Optional[[]]
在 REST 控制器中,代码进入 if 循环并且在屏幕上不显示任何内容,因为列表是空的,即
if(cId.isPresent()) {
return ResponseEntity.ok(cId);
}
为什么?为什么 cId.isPresent() return 为真并且代码进入 if 循环。理想情况下,代码应该进入 else 循环并抛出异常,因为列表是空的。这仅发生在 List 的情况下,似乎我的其他方法具有 return 类型的 POJO 没有此问题。
请帮助我了解此行为以及应该如何解决此问题。
cId.isPresent()
return true
因为
List<EquityFeeds>
不是 null ,它是空列表
if(!cId.get().isEmpty()) {
return ResponseEntity.ok(cId);
} else {
throw new ClientIdNotFoundException(clientId);
}
Optional.isPresent
returns true
的原因是有一个实际值 - 空 List
。 Optional
检查它持有的值是否是 null
,没有别的。 isPresent
检查值是否存在于 Optional
中,而不是存在于 List
本身中。
所以你必须对待 Optional
有点不同。此外,不要像那样使用 Optional
来替代 if-else
结构。
这里有一个方法:
return cId.filter(Predicate.not(List::Empty)) // if the list is not empty
.map(ResponseEntity::ok) // create a response
.orElseThrow(() -> // or else throw an exception
new ClientIdNotFoundException(clientId));
顺便说一下,您不想return Optional
包裹在ResponseEntity
里面。打开它,return List
本身。如果为空或者null
已经处理过,先抛出异常。
return cId.filter(Predicate.not(List::Empty))
.map(Optional::get) // exctract from the Optional
.map(ResponseEntity::ok)
.orElseThrow(() -> new ClientIdNotFoundException(clientId));
我有一个 REST 控制器
@GetMapping("/getByClientId/{clientId}")
public ResponseEntity<Optional<List<EquityFeeds>>> getByClientId(@PathVariable("clientId") final String clientId) {
Optional<List<EquityFeeds>> cId = Optional.ofNullable(equityFeedsService.findByClientId(clientId));
System.out.println("Client Id: "+cId);
if(cId.isPresent()) {
return ResponseEntity.ok(cId);
} else {
cId.orElseThrow(() -> new ClientIdNotFoundException(clientId));
}
return ResponseEntity.ok(cId);
}
服务Class代码:
public List<EquityFeeds> findByClientId(String clientId) {
List<EquityFeeds> cId = equityFeedsRedisRepositoryImpl.findByClientId(clientId);
System.out.println("In EquityFeedService "+cId);
return cId;
}
实施。代码(REDIS):
public List<EquityFeeds> findByClientId(String clientId) {
return (List<EquityFeeds>) listOperations.range(clientId, 0, -1);
}
问题: 1) 当使用 REST 控制器调用 getClientId 并且 clientId 不存在于 REDIS 缓存中时:
Service class Code returns: In EquityFeedService []
The REST Controller returns: Client Id: Optional[[]]
在 REST 控制器中,代码进入 if 循环并且在屏幕上不显示任何内容,因为列表是空的,即
if(cId.isPresent()) {
return ResponseEntity.ok(cId);
}
为什么?为什么 cId.isPresent() return 为真并且代码进入 if 循环。理想情况下,代码应该进入 else 循环并抛出异常,因为列表是空的。这仅发生在 List 的情况下,似乎我的其他方法具有 return 类型的 POJO 没有此问题。
请帮助我了解此行为以及应该如何解决此问题。
cId.isPresent()
return true
因为
List<EquityFeeds>
不是 null ,它是空列表
if(!cId.get().isEmpty()) {
return ResponseEntity.ok(cId);
} else {
throw new ClientIdNotFoundException(clientId);
}
Optional.isPresent
returns true
的原因是有一个实际值 - 空 List
。 Optional
检查它持有的值是否是 null
,没有别的。 isPresent
检查值是否存在于 Optional
中,而不是存在于 List
本身中。
所以你必须对待 Optional
有点不同。此外,不要像那样使用 Optional
来替代 if-else
结构。
这里有一个方法:
return cId.filter(Predicate.not(List::Empty)) // if the list is not empty
.map(ResponseEntity::ok) // create a response
.orElseThrow(() -> // or else throw an exception
new ClientIdNotFoundException(clientId));
顺便说一下,您不想return Optional
包裹在ResponseEntity
里面。打开它,return List
本身。如果为空或者null
已经处理过,先抛出异常。
return cId.filter(Predicate.not(List::Empty))
.map(Optional::get) // exctract from the Optional
.map(ResponseEntity::ok)
.orElseThrow(() -> new ClientIdNotFoundException(clientId));