我有一个 Foo 对象列表,其中每个 Foo 包含一个名称和一个列表
我正在努力
这是我还没有的代码。
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(),我想避免使用它们。 如果有更好的方法来链接这些,请告诉我。
蒂亚
您正在寻找 Optional.map()
如果存在值,则对其应用提供的映射函数,如果结果非空,则返回描述结果的Optional。否则返回一个空的Optional。
返回该值(如果存在),否则调用其他值并返回该调用的结果。
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;
});
}