Lambda 如何使用optional和filter从wsdl2java生成的链接/级联对象中检索对象
我知道在Java中处理分层对象时建议使用flatMap,特别是从XML文件创建的对象中提取值时 由于不依赖于可选项,而且getCommercieleNaam()将为我提供一个列表,因此我编码: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
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()));