首页 > 解决方案 > 在 Java 8 中使用 Optional.empty 默认 Optional orElse

问题描述

这里是 Java 8。我需要在两个 POJO 列表中搜索一个字符串,并希望正确使用 Stream/Optional API。

如果名称出现在第一个列表(“ lunches”)中,那么我想返回一个包含它的选项。否则,如果名称出现在第二个列表(“ dinners”)中,那么我想返回一个包含它的选项。Optional.empty()否则,如果名称不存在于任一列表中,我想返回。迄今为止我最好的尝试:

public class Restaurant {

    private String id;
    private String name;
    private List<Food> lunches;
    private List<Food> dinners;

    public Optional<Food> findFoodByName(String name) {

        return Optional.of(lunches.stream()
                                  .filter(food -> food.getName()
                                                      .equalsIgnoreCase(name))
                                  .findFirst())
                       .orElse(dinners.stream()
                                      .filter(food -> food.getName()
                                                          .equalsIgnoreCase(name))
                       .findFirst());
//                     .orElse(null);        TODO: how to return empty optional if neither in 'lunches' nor 'dinners'?

    }

}

谁能帮我在这里越过终点线?

标签: javajava-8java-stream

解决方案


结合使用列表Stream.of并检查元素或返回Optional.empty()

Stream.of(lunches, dinners)
      .flatMap(List::stream)
      .filter(s -> s.getName()
                    .equalsIgnoreCase(name))
      .findFirst();

根据@Holger 的建议,您还可以使用Stream.concat连接两个流,然后检查元素

Stream.concat(lunches.stream(), dinners.stream())
      .filter(s -> s.getName()
                    .equalsIgnoreCase(name))
      .findFirst();

推荐阅读