【问题标题】:converting foreach to filter [duplicate]将foreach转换为过滤器[重复]
【发布时间】:2021-01-22 18:16:07
【问题描述】:

我想转换

List<FlightPositionRoute> flightPositionRoutes = new ArrayList<>();

            dtos.stream()
                    .map(a-> positions.getPositions(a.getId()
                            .getValue()))
                    .forEach(flightPositionRoute -> 
                               flightPositionRoute.ifPresent(flightPositionRoutes::add));

到这里:

List<FlightPositionRoute> flightPositionRoutes = dtos.stream()
                    .map(a-> positions.getPositions(a.getId()
                            .getValue()))
                    .filter(Optional::isPresent)
                    .collect(Collectors.toList());

我的意思是我想使用过滤器而不是foreach,因为它更漂亮;)

不幸的是,我得到了

Required type: List <FlightPositionRoute>
Provided: List <Optional<FlightPositionRoute>>

我该如何修复它?

【问题讨论】:

  • ....filter(Optional::isPresent).map( e -&gt; e.get())...
  • flatMap by Optional:stream 应该足够了:dtos.stream().map(a-&gt; positions.getPositions(a.getId().getValue())).flatMap(Optional::stream).collect(Collectors.toList()); 将提供List&lt;FlightPositionRoute&gt;

标签: java java-stream


【解决方案1】:

你只需要解压Optional:

List<FlightPositionRoute> flightPositionRoutes = dtos.stream()
    .map(a-> positions.getPositions(a.getId().getValue()))
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 2016-09-30
    • 2019-07-22
    • 2021-08-15
    • 2016-08-10
    • 2012-10-29
    • 2020-09-05
    • 2022-12-19
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多