Lambda 是否可以使用两次ifPresent,每次检查不同的返回或分支映射

Lambda 是否可以使用两次ifPresent,每次检查不同的返回或分支映射,lambda,java-8,stream,jaxb,optional,Lambda,Java 8,Stream,Jaxb,Optional,上下文:我已经链接了wsdl2java生成的对象。有一个已经创建的方法调用soapweb服务,接收xml并在级联对象中解组它 Desire:我想得到两个不同的对象,它们位于不同的层次节点中。从映射的角度来看,他们彼此“相距遥远”,但从商业的角度来看,他们是一对“夫妻” 这项工作目前正在进行: Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode) /

上下文:我已经链接了wsdl2java生成的对象。有一个已经创建的方法调用soapweb服务,接收xml并在级联对象中解组它

Desire:我想得到两个不同的对象,它们位于不同的层次节点中。从映射的角度来看,他们彼此“相距遥远”,但从商业的角度来看,他们是一对“夫妻”

这项工作目前正在进行:

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode) //same return
        .map(CodeOndernemingOfVestigingType::getValue) // different object return
        .ifPresent(o -> myMethod("onderneming_type", o.getValue()));

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode) //same return
        .map(CodeOndernemingOfVestigingType::getBeschrijving) // different object return
        .ifPresent(o -> myMethod("onderneming_type_omschrijving", o.getValue()));
我尝试的是(伪解释):

我知道这不起作用,因为我只能有一个终止条款,而ifPresent出现两次

从虚拟的角度来看,我的问题也可能是:是否有可能在同一个lambda表达式中在两个不同的方向上分叉/分叉/划分映射

***根据尤金的建议,我成功地做到了

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode)
        .ifPresent(o -> {
            System.out.println(o.getValue().getValue());
            System.out.println(o.getBeschrijving().getValue());
        }); 
我将myMethod更改为System.out.println,因此不会引起混淆(在本文中我不关心myMethod。它可以是任何实例化对象的任何其他方法)


尽管它可以工作,而且与最初的一个相比听起来进步很大(不是两个lambda语句,而是只有一个),但我看到了一些问题:“o.getValue().getValue()”和“o.getBeschrijving().getValue()”都是空的不安全,不是吗

如果你不介意的话,我在这里简化了你的例子,下面是我的想法:

static class User {

    private final Integer age;

    private final String name;

    public User(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    public Optional<Integer> getAge() {
        return Optional.ofNullable(age);
    }

    public String getName() {
        return name;
    }
}
静态类用户{
私人最终整数年龄;
私有最终字符串名;
公共用户(整数年龄,字符串名称){
这个。年龄=年龄;
this.name=名称;
}
公共可选getAge(){
返回可选。未满(年龄);
}
公共字符串getName(){
返回名称;
}
}
然后:

    Optional<User> user = Optional.of(new User(null, "test"));

    user.map(u -> Map.entry(u, u.getAge())) // this is java-9 Map.entry; but you can use a Pair or a List/array etc
            .ifPresent(x -> {
                System.out.println("name = " + x.getKey().getName());
                x.getValue().ifPresent(age -> {
                    System.out.println("age = " + age);
                });
            });
Optional user=Optional.of(新用户(null,“test”);
user.map(u->map.entry(u,u.getAge())//这是java-9 map.entry;但您可以使用一对或一个列表/数组等
.如果存在(x->{
System.out.println(“name=“+x.getKey().getName());
x、 getValue().ifPresent(年龄->{
System.out.println(“age=“+age”);
});
});

您可以将相同的内容应用于输入

您可以这样捕获结果:

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode)
    .map(CodeOndernemingOfVestigingType::getValue) 
    .map(o -> {
        myMethod("onderneming_type", o.getValue());
        return o.getBeschrijving();
    })
    .ifPresent(o -> myMethod("onderneming_type_omschrijving", o.getValue()));
请注意,多行lambda是不好的,很难读取,所以您可以将其提取到私有方法中

编辑 您想要分支您的
可选
。不可能,您应该执行以下操作:

Optional<Code> op = Optional.ofNullable(onderneming.getOndernemingOfVestiging())
    .map(OndernemingOfVestigingType::getCode) 

op.map(CodeOndernemingOfVestigingType::getValue)
    .ifPresent(o -> myMethod("onderneming_type", o.getValue()));

op.map(CodeOndernemingOfVestigingType::getBeschrijving) 
    .ifPresent(o -> myMethod("onderneming_type_omschrijving", o.getValue()));

它应该比一些黑客更具可读性

您想使用
myMethod
进行映射,还是仍然使用原始值?探索Java9中引入的方法如何?@Nullpointer,谢谢,但我还不能使用Java9。@拜,我不明白您的问题。基本上,我想从一个实例调用一个方法。为了简化,可以使用System.out.println(o.getValue)代替myMethod。。。返回o..getBeschrijving();因为o(作为回报…)与前一个o(o.getValue)是同一个对象,所以不起作用。好的,我编辑了我的答案。我没看到你想要布兰奇,我没看到这个名字叫“布兰奇”。当我说“…用同一个lambda表达式在两个不同方向上分叉/划分贴图”时,我可能表达错了自己。顺便说一下,我认为你最后的评论是对我的问题的最终回答。我将停止尝试在一个Lambda句子中编写代码,我将遵循您的想法,我知道这非常接近我在问题最顶端发布的两行。我相信您理解我的问题,但我无法将您的建议完全应用到我的案例中。基于你的想法,我做了一些只在一句lambda中有效的事情,但我认为这不是零安全。
Optional<Code> op = Optional.ofNullable(onderneming.getOndernemingOfVestiging())
    .map(OndernemingOfVestigingType::getCode) 

op.map(CodeOndernemingOfVestigingType::getValue)
    .ifPresent(o -> myMethod("onderneming_type", o.getValue()));

op.map(CodeOndernemingOfVestigingType::getBeschrijving) 
    .ifPresent(o -> myMethod("onderneming_type_omschrijving", o.getValue()));