Java8에서 람다를 사용하여 null이 아닌 경우에만 값 필터링
나는 다음과 같은 사물 목록을 가지고 있다.car
Java 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
'programing' 카테고리의 다른 글
Java에서 clojure 호출 (0) | 2022.06.20 |
---|---|
Vuej 및 부트스트랩 Vue에서 행 편집 (0) | 2022.06.20 |
컴파일러가 명백히 초기화되지 않은 변수를 감지하지 못함 (0) | 2022.06.20 |
Vue.js - 입력, v-model 및 계산된 속성 (0) | 2022.06.20 |
vuex 모듈 내에서 작업/변화를 청취합니다. (0) | 2022.06.19 |