programing

Java8에서 람다를 사용하여 null이 아닌 경우에만 값 필터링

prostudy 2022. 6. 20. 20:53
반응형

Java8에서 람다를 사용하여 null이 아닌 경우에만 값 필터링

나는 다음과 같은 사물 목록을 가지고 있다.carJava 8을 사용하여 일부 파라미터를 기준으로 이 목록을 필터링하고 싶습니다.단, 파라미터가null, 그것은 던진다.NullPointerException. null 값을 필터링하려면 어떻게 해야 합니까?

현재 코드는 다음과 같습니다.

requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));

이것은 던져진다NullPointerException한다면getName()돌아온다null.

이 예에서는 @Tagir가 100% 맞다고 생각합니다.하나의 필터에 넣어 2개의 체크를 실시합니다.나는 사용하지 않을 것이다.Optional.ofNullable옵션 항목은 반환 유형이 논리를 수행하지 않도록 하기 위한 것입니다.사실 여기도 저기도 아니에요.

제가 지적하고 싶은 건java.util.Objects에는, 폭넓은 케이스의 적절한 방법이 있기 때문에, 다음과 같이 할 수 있습니다.

    cars.stream()
        .filter(Objects::nonNull)

그러면 null 객체가 지워집니다.잘 모르는 분들을 위해 다음과 같은 단문입니다.

    cars.stream()
        .filter(car -> Objects.nonNull(car))

다음 문자로 시작하는 차량 이름 목록을 반환하기 위해 당면한 질문에 부분적으로 답변하는 방법"M":

    cars.stream()
        .filter(car -> Objects.nonNull(car))
        .map(car -> car.getName())
        .filter(carName -> Objects.nonNull(carName))
        .filter(carName -> carName.startsWith("M"))
        .collect(Collectors.toList());

속기 람다에 익숙해지면 다음과 같이 할 수도 있습니다.

    cars.stream()
        .filter(Objects::nonNull)
        .map(Car::getName)        // Assume the class name for car is Car
        .filter(Objects::nonNull)
        .filter(carName -> carName.startsWith("M"))
        .collect(Collectors.toList());

아쉽게도 한 번번이.map(Car::getName)이름만 돌려주고 차는 돌려주지 않을 겁니다그래서 덜 아름답지만 질문에 충분히 답합니다.

    cars.stream()
        .filter(car -> Objects.nonNull(car))
        .filter(car -> Objects.nonNull(car.getName()))
        .filter(car -> car.getName().startsWith("M"))
        .collect(Collectors.toList());

차 안에 있는 차만 걸러내면 돼null이름:

requiredCars = cars.stream()
                   .filter(c -> c.getName() != null)
                   .filter(c -> c.getName().startsWith("M"));

제안된 답변은 훌륭합니다.의 사례를 처리하기 위한 개선점을 제안하고 싶습니다.null을 사용하여 리스트 하다Optional.ofNullable, Java 8의 신기능:

List<String> carsFiltered = Optional.ofNullable(cars)
                    .orElseGet(Collections::emptyList)
                    .stream()
                    .filter(Objects::nonNull)
                    .collect(Collectors.toList());

따라서 완전한 답은 다음과 같습니다.

List<String> carsFiltered = Optional.ofNullable(cars)
                    .orElseGet(Collections::emptyList)
                    .stream()
                    .filter(Objects::nonNull) //filtering car object that are null
                    .map(Car::getName) //now it's a stream of Strings
                    .filter(Objects::nonNull) //filtering null in Strings
                    .filter(name -> name.startsWith("M"))
                    .collect(Collectors.toList()); //back to List of Strings

이것은, 1 개의 필터 스텝으로 실행할 수 있습니다.

requiredCars = cars.stream().filter(c -> c.getName() != null && c.getName().startsWith("M"));

전화하기 싫으면getName()몇 번인가(예를 들면, 고액의 콜)를 실시하면, 다음과 같이 할 수 있습니다.

requiredCars = cars.stream().filter(c -> {
    String name = c.getName();
    return name != null && name.startsWith("M");
});

또는 보다 정교한 방법으로:

requiredCars = cars.stream().filter(c -> 
    Optional.ofNullable(c.getName()).filter(name -> name.startsWith("M")).isPresent());

파워의 활용하다java.util.Optional#map():

List<Car> requiredCars = cars.stream()
  .filter (car -> 
    Optional.ofNullable(car)
      .map(Car::getName)
      .map(name -> name.startsWith("M"))
      .orElse(false) // what to do if either car or getName() yields null? false will filter out the element
    )
  .collect(Collectors.toList())
;

이것을 사용할 수 있다

List<Car> requiredCars = cars.stream()
    .filter (t->  t!= null && StringUtils.startsWith(t.getName(),"M"))
    .collect(Collectors.toList());

언급URL : https://stackoverflow.com/questions/32884195/filter-values-only-if-not-null-using-lambda-in-java8

반응형