Java 中的链接Optional 和Stream(最好是11)

问题描述 投票:0回答:1

我有一个 Foo 对象列表,其中每个 Foo 包含一个名称和一个列表

我正在努力

  1. 查找 fooList 是否包含具有目标名称的 Foo 对象,如果存在这样的元素,
  2. 查找目标字符串集是否是找到的 Foo 实例中的 List stringList 的子集。

这是我还没有的代码。

import java.util.List;

public class Foo {
    String fooName;
    List<String> bars;

    public Foo(String fooName, List<String> bars) {
        this.fooName = fooName;
        this.bars = bars;
    }

    public String getFooName() {
        return fooName;
    }

    public List<String> getBars() {
        return bars;
    }
}

    @Test
    public boolean demo() {

        List<Foo> fooList = new ArrayList<>();
        // add foos and bars

        String fooNameToFind = "some-target-name";

        Set<String> barsToFind = new HashSet<>();
        // add to list of target bar names

        Optional<Foo> optionalFoo = fooList.stream()
                .filter(foo -> foo.getFooName().equals(fooNameToFind))
                .findFirst();

        if (optionalFoo.isEmpty()) {
            // have to log something here
            Logger.getAnonymousLogger().info("target foo not found");
            return false;
        }

        boolean success = optionalFoo.get().getBars().stream()
                .filter(barsToFind::remove)
                .anyMatch(__ -> barsToFind.isEmpty());

        if (!success) {
            Logger.getAnonymousLogger().info("no match for list of bar names for given foo name");
        }

        return success;
    }

只要找不到目标名称或列表子集,我就希望记录。 如您所见,我当前正在使用 .isEmpty() 和 .get(),我想避免使用它们。 如果有更好的方法来链接这些,请告诉我。

蒂亚

java lambda stream option-type
1个回答
0
投票

您正在寻找 Optional.map()

如果存在值,则对其应用提供的映射函数,如果结果非空,则返回描述结果的Optional。否则返回一个空的Optional。

Optional.orElseGet()

返回该值(如果存在),否则调用其他值并返回该调用的结果。

public boolean demo() {
  //get optional foo
  return optionalFoo
          .map(foo -> {
            boolean result = foo.getBars()
                    .stream()
                    .filter(barsToFind::remove)
                    .anyMatch(__ -> barsToFind.isEmpty());
            if (!result) {
              //log stuff
            }
            return result;
          })
          .orElseGet(() -> {
            //log stuff
            return false;
          });
}
© www.soinside.com 2019 - 2024. All rights reserved.