java—如何检查可选值是否为null以及如何将其传递给其他方法?

sbdsn5lh  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(298)

我需要通过 dateTs 从rest控制器类方法到 getCars() 方法,该方法将检索在给定时间戳日期注册的汽车,并且如果时间戳 dateTs (可选)为空,则它将检索所有车辆。我认为目前的实施不会奏效,因为如果 dateTs 如果为null,则无法将其传递到 getCars() 它需要类型的值 Long . 我应该在哪里以及如何检查 dateTs 不为空以及如何将相应的值传递到 getCars() 调用合适的方法?

@GetMapping(value = "/get/cars")
public CarList CarController(@Param("dateTs") Optional<Long> dateTs) {

return ResponseEntity.ok(carService.getCars((Long) dateSt.get());
}

服务类方法:

public List<Car> getCars(Long dateSt) {
   List<Car> carList; 

   if(dateSt != null){
       carList = carReposistory.retrieveRegisteredCars(dateSt);}
   else{
      carList = carReposistory.retrieveAllCars();} 

   return carList;
}
wgx48brx

wgx48brx1#

只是一张纸条:a Long 可以是 null ,因此可以传递给 getCars(Long) . 它是一个 long 那不可能 null ,因为它是原始的。
问题可能是 Optional#get() 抛出 NoSuchElementException 如果在 Optional (其价值为 null ),你可以用 Optional#orElse() 例如:

return ResponseEntity.ok(carService.getCars((Long) dateSt.orElse(null));

使用 Optional#isPresent() 正如其他答案所暗示的,这是一个(可能更好)的选择。
为了便于参考,请查阅 orElse .
注2:还要检查这个问题及其答案:为什么Java8的optional不能用在参数中

jtw3ybtb

jtw3ybtb2#

你可以用两种方法来做。可选择通过 getCars 或者没有。通过时:

public List<Car> getCars(Optional<Long> dateSt) {
   if(dateSt.isPresent()){
       return carReposistory.retrieveRegisteredCars(dateSt.get());
   }
   return carReposistory.retrieveAllCars(); 
}

不传递:必须创建两个独立的方法:

public List<Car> retrieveRegisteredCars(Long dateSt) {
   return carReposistory.retrieveRegisteredCars(dateSt);
}

public List<Car> retrieveAllCars() {
   return carReposistory.retrieveAllCars(); 
}

并在控制器中使用它们:

return ResponseEntity.ok(
  dateSt.map(carService::retrieveRegisteredCars)
  .orElseGet(() -> carService.retrieveAllCars())
);

更新

或者只传递null

return ResponseEntity.ok(carService.getCars((Long) dateSt.orElse(null)));
cfh9epnr

cfh9epnr3#

你通常不想通过 Optional s作为参数,但是我不知道它是否适用于rest控制器。看到这个了吗
既然这么说了,你应该在你的服务中有两种方法,一种是当它存在时,另一种是当它不存在时。
控制器

@GetMapping(value = "/get/cars")
public CarList CarController(@Param("dateTs") Optional<Long> dateTs) {
    return ResponseEntity.ok(
               dateTs.map(carService::getRegisteredCars)
                     .orElseGet(carService::getAllCars)
           );
}

服务

public List<Car> getRegisteredCars(Long dateSt) {
    return carReposistory.retrieveRegisteredCars(dateSt);
}

public List<Car> getAllCars() {
    return carReposistory.retrieveAllCars();
}

相关问题