Stream if not null 并获取第一个对象
Stream if not null and get the first object
我正在尝试在列表上应用流,该列表可以是 null
,因为它正在调用存储库方法,如果它不为空,我想从中获取第一个元素并比较它的一个参数具有请求值。
Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
.orElseGet(Collections::emptyList)
.stream()
.filter(Objects::nonNull)
.findFirst()
.get()
.getPlacementDate()
.isAfter(placementRequest.getPlacementDate())
目前,如果列表本身是 null
,则它在 .get
处失败,尽管我使用 nonNull 进行了过滤。如果列表不为空,我想流式传输列表并获取第一个元素并将其参数与其他值进行比较。我尝试了其他替代过滤器,但没有成功
Optional<T> findFirst();
,所以如果你有 null
或 empty
流,那么这个方法 returns null
.
你应该使用.findFirst().orElseGet(() -> /* NULL object*/)
问题是 .findFirst()
能够 return 没有结果,.get()
会失败。您可以使用 .ifPresent()
或使用 .orElseGet()
I want stream the list if the list is not null and get the first
element and compare its parameter against other value.
您没有想到存储库返回的列表中存在空元素或空元素的情况。您必须选择一个默认值或仅当存在可选值时才执行日期比较。
例如,默认日期值:
final LocalDate defaultDateValue = ...;
Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
.flatMapping(l -> l.stream()
.filter(Objects::nonNull)
.findFirst()
.mapping(o -> o.getPlacementDate())
)
.orElse(defaultDateValue)
.isAfter(placementRequest.getPlacementDate())
有条件处理:
Optional<LocalDate> opt =
Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
.flatMapping(l -> l.stream()
.filter(Objects::nonNull)
.findFirst()
.mapping(o -> o.getPlacementDate())
)
if (opt.isPresent()){
boolean isAfter = opt.get().isAfter(placementRequest.getPlacementDate());
// ...
}
考虑到您列表中的元素类型是 YourPojo
,此代码段应该可以满足您的需要:
List<YourPojo> list = placementRepository.findAllByAccountId(accountId);
LocalDate date = placementRequest.getPlacementDate();
boolean flag =
Optional.ofNullable(list) // Optional<List<YourPojo>>
.flatMap(Collection::stream) // Stream<YourPojo>
.filter(Objects::nonNull) // Stream<YourPojo>
.findFirst() // Optional<YourPojo>
.map(YourPojo::getPlacementDate) // Optional<LocalDate>
.map(d -> d.isAfter(date)) // Optional<Boolean>
.orElse(false); // Boolean
注意:如果您使用的是 Java 11 或更高版本,则 .map(d -> d.isAfter(date))
可以替换为 .map(not(date::isBefore))
。不确定它是否更具可读性。
我正在尝试在列表上应用流,该列表可以是 null
,因为它正在调用存储库方法,如果它不为空,我想从中获取第一个元素并比较它的一个参数具有请求值。
Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
.orElseGet(Collections::emptyList)
.stream()
.filter(Objects::nonNull)
.findFirst()
.get()
.getPlacementDate()
.isAfter(placementRequest.getPlacementDate())
目前,如果列表本身是 null
,则它在 .get
处失败,尽管我使用 nonNull 进行了过滤。如果列表不为空,我想流式传输列表并获取第一个元素并将其参数与其他值进行比较。我尝试了其他替代过滤器,但没有成功
Optional<T> findFirst();
,所以如果你有 null
或 empty
流,那么这个方法 returns null
.
你应该使用.findFirst().orElseGet(() -> /* NULL object*/)
问题是 .findFirst()
能够 return 没有结果,.get()
会失败。您可以使用 .ifPresent()
或使用 .orElseGet()
I want stream the list if the list is not null and get the first element and compare its parameter against other value.
您没有想到存储库返回的列表中存在空元素或空元素的情况。您必须选择一个默认值或仅当存在可选值时才执行日期比较。
例如,默认日期值:
final LocalDate defaultDateValue = ...;
Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
.flatMapping(l -> l.stream()
.filter(Objects::nonNull)
.findFirst()
.mapping(o -> o.getPlacementDate())
)
.orElse(defaultDateValue)
.isAfter(placementRequest.getPlacementDate())
有条件处理:
Optional<LocalDate> opt =
Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
.flatMapping(l -> l.stream()
.filter(Objects::nonNull)
.findFirst()
.mapping(o -> o.getPlacementDate())
)
if (opt.isPresent()){
boolean isAfter = opt.get().isAfter(placementRequest.getPlacementDate());
// ...
}
考虑到您列表中的元素类型是 YourPojo
,此代码段应该可以满足您的需要:
List<YourPojo> list = placementRepository.findAllByAccountId(accountId);
LocalDate date = placementRequest.getPlacementDate();
boolean flag =
Optional.ofNullable(list) // Optional<List<YourPojo>>
.flatMap(Collection::stream) // Stream<YourPojo>
.filter(Objects::nonNull) // Stream<YourPojo>
.findFirst() // Optional<YourPojo>
.map(YourPojo::getPlacementDate) // Optional<LocalDate>
.map(d -> d.isAfter(date)) // Optional<Boolean>
.orElse(false); // Boolean
注意:如果您使用的是 Java 11 或更高版本,则 .map(d -> d.isAfter(date))
可以替换为 .map(not(date::isBefore))
。不确定它是否更具可读性。