Lambda 如何使用optional和filter从wsdl2java生成的链接/级联对象中检索对象

Lambda 如何使用optional和filter从wsdl2java生成的链接/级联对象中检索对象,lambda,java-8,stream,wsdl,optional,Lambda,Java 8,Stream,Wsdl,Optional,我知道在Java中处理分层对象时建议使用flatMap,特别是从XML文件创建的对象中提取值时 由于不依赖于可选项,而且getCommercieleNaam()将为我提供一个列表,因此我编码: NaamOndernemingLijstCommercieelType naamOndernemingLijstCommercieel = onderneming.getNamen() .getCommercieleNamen(); NaamOndernemingType naamOnde

我知道在Java中处理分层对象时建议使用flatMap,特别是从XML文件创建的对象中提取值时

由于不依赖于可选项,而且getCommercieleNaam()将为我提供一个列表,因此我编码:

NaamOndernemingLijstCommercieelType naamOndernemingLijstCommercieel = onderneming.getNamen()
        .getCommercieleNamen();
NaamOndernemingType naamOndernemingType = naamOndernemingLijstCommercieel.getCommercieleNaam().stream()
        .filter(x -> x.getTaalcode().getValue() == "nl").findFirst().get();
简而言之,它将遍历并抛出cascade对象,并返回为language找到的第一个名称。我认为这是非常不安全的,我宁愿使用Optional,而不是检查所有对象是否为null

然后,我尝试编写我认为正确的代码,但我不知道如何应用过滤器,以便仅从列表中检索符合条件的对象(在我的场景中,语言==“nl”):

注:未来的读者我的发现值得一读,我的另一个问题是: 我认为您不需要在这里创建映射,因为您已经说过
getCommercieleNaam
返回一个
列表
,因此,一旦我们展开,我们将得到一个
,然后我们可以找到所有以
“nl”
作为字符串表示的对象

List<NaamOndernemingType> listNaamOndernemingType = optionalNamenOnderneming
           .flatMap(NaamOndernemingLijstCommercieelType::getCommercieleNaam)              
           .filter(Objects::nonNull)
           .filter(x -> "nl".equals(x.toString()))
           .orElse(null);
List listNaamOndernemingType=optionalnamenderming
.flatMap(NaamOndernemingLijstCommercieelType::getCommercieleNaam)
.filter(对象::非空)
.filter(x->“nl”.equals(x.toString()))
.orElse(空);
假设
可选
没有
收集
作为终端操作,我们可以简单地使用
orElse
返回值(如果存在),否则返回
null
。在这种情况下,值是一个
列表


注意-如果您想将
更改为
,则只需调用flatMap,否则您只需要调用map即可返回
,,这要感谢Aominè建议和基于

我找到了这个解决方案:

Optional.ofNullable(onderneming.getNamen()).map(NamenOndernemingType::getCommercieleNamen)
                .map(NaamOndernemingLijstCommercieelType::getCommercieleNaam).get().stream().filter(Objects::nonNull)
                .filter(x -> x.getTaalcode().getValue() == "nl").findFirst()
                .ifPresent(o -> myMethod("onderneming_commerciele_naam", o.getNaam().getValue()));

当我说getCommercieleNamen()返回一个列表时,可能我没有正确地表达。请查看错误I a,根据您的建议,并在上面粘贴GetCommercieElenamen()@JimC查看编辑,并且从您的屏幕截图中,您有输入错误,即在我的代码中,我没有编写
Object::nonNull
我编写了
Objects::nonNull
@JimC变量的名称非常混乱,因为它们都非常相似。尽管如此,我的帖子中显示了它的要点。您不需要再添加任何中间操作。因此,只需确保将正确类型的数据传递到
flatMap
。1方法flatMap(函数
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "NamenOndernemingType", propOrder = {
    "maatschappelijkeNamen",
    "afgekorteNamen",
    "commercieleNamen"
})
public class NamenOndernemingType {

...

    public NaamOndernemingLijstCommercieelType getCommercieleNamen() {
        return commercieleNamen;
    }


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "NaamOndernemingLijstCommercieelType", propOrder = {
    "commercieleNaam"
})
public class NaamOndernemingLijstCommercieelType {
...

    public List<NaamOndernemingType> getCommercieleNaam() {
Optional.ofNullable(onderneming.getNamen()).map(NamenOndernemingType::getCommercieleNamen)
                .map(NaamOndernemingLijstCommercieelType::getCommercieleNaam).get().stream().filter(Objects::nonNull)
                .filter(x -> x.getTaalcode().getValue() == "nl").findFirst()
                .ifPresent(o -> myMethod("onderneming_commerciele_naam", o.getNaam().getValue()));
List<NaamOndernemingType> listNaamOndernemingType = optionalNamenOnderneming
           .flatMap(NaamOndernemingLijstCommercieelType::getCommercieleNaam)              
           .filter(Objects::nonNull)
           .filter(x -> "nl".equals(x.toString()))
           .orElse(null);
Optional.ofNullable(onderneming.getNamen()).map(NamenOndernemingType::getCommercieleNamen)
                .map(NaamOndernemingLijstCommercieelType::getCommercieleNaam).get().stream().filter(Objects::nonNull)
                .filter(x -> x.getTaalcode().getValue() == "nl").findFirst()
                .ifPresent(o -> myMethod("onderneming_commerciele_naam", o.getNaam().getValue()));