【发布时间】:2021-07-29 09:34:12
【问题描述】:
我对 Java 流很陌生,我正在尝试使用流实现一种方法,但是当我尝试返回值时,它向我抛出了错误 Unexpected return value。我只是想知道我做错了什么。
以下是引发错误的Arrays.stream 值内的返回:
Object[] result = extensionBuilder((Map) extension.getValue());
Arrays.stream(result).forEach(innerExtension -> {
return new JAXBElement<JAXBElement>(new QName(getCleanLabel(extension.getKey())), JAXBElement.class, (JAXBElement) innerExtension);
});
但是,如果我尝试返回 Arrays.stream 之外的单个值,那么我可以获得第一个值。 (如您所见,我只返回第一个值 result[0])
Object[] result = extensionBuilder((Map) extension.getValue());
Arrays.stream(result).forEach(innerExtension -> {
System.out.println((JAXBElement) innerExtension);
});
return new JAXBElement<JAXBElement>(new QName(getCleanLabel(extension.getKey())), JAXBElement.class, (JAXBElement) result[0]);
我想将Object[] result中的值一一传递,并将结果返回给我的调用方法。
这是我拥有的完整方法:
private Object[] extensionBuilder(Map<String, Object> extensions) {
if (extensions == null) {
return null;
}
return extensions.entrySet().stream().map(extension -> {
if (extension.getValue() instanceof Map) {
// return new JAXBElement<JAXBElement>(new QName(getCleanLabel(extension.getKey())), JAXBElement.class,
// (JAXBElement) extensionBuilder((Map) extension.getValue())[0]);
Object[] result = extensionBuilder((Map) extension.getValue());
Arrays.stream(result).forEach(innerExtension -> {
System.out.println((JAXBElement) innerExtension);
});
return new JAXBElement<JAXBElement>(new QName(getCleanLabel(extension.getKey())), JAXBElement.class, (JAXBElement) result[0]);
} else {
return new JAXBElement<String>(new QName(getCleanLabel(extension.getKey())), String.class, extension.getValue().toString());
}
}).filter(Objects::nonNull).collect(Collectors.toList()).toArray(Object[]::new);
}
这是给方法的输入:
{nameSpace:MyField-2={fb:My-Sub-Field-1={nameSpace:MyField-1=myValue, nameSpace:MyField-2=myValue, nameSpace:MyField-3=myValue}, nameSpace2:My-Sub-Field-2={nameSpace:MyField-4=myValue4, nameSpace:MyField-5=myValue5, nameSpace:MyField-6=myValue6}, nameSpace:MyField-7MyField-3=myValue1}, nameSpace:MyField-8=Name}
我对此有点困惑很长时间了。有人可以帮助我如何使用流完成返回概念吗?
基本上,我想返回 Object[] result 中每个元素的值,到目前为止,我只能为一个元素执行此操作,但我希望为 Object[] result 中存在的每个对象返回值
***** 5 月 11 日编辑 ******
根据对问题的回复,我可以做到,但我得到的回复看起来像这样:
<namespace:MainField>
<namespace:SubField1>
<namespace:Field1>Value1</namespace:Field1>
</namespace:SubField1>
</namespace:MainField>
<namespace:MainField>
<insta:SubField2>
<insta:Field2>Value2</insta:Field2>
</insta:SubField2>
</namespace:MainField>
<namespace:MainField>
<namespace:SubField3>SubValue3</namespace:SubField3>
</namespace:MainField>
<namespace:MainField2>MainValue2</namespace:MainField2>
<namespace:MainField3>MainValue3</namespace:MainField3>
而我正在寻找这样的东西:
<namespace:MainField>
<namespace:SubField1>
<namespace:Field1>Value1</namespace:Field1>
</namespace:SubField1>
<insta:SubField2>
<insta:Field2>Value2</insta:Field2>
</insta:SubField2>
<namespace:SubField3>SubValue3</namespace:SubField3>
</namespace:MainField>
<namespace:MainField2>MainValue2</namespace:MainField2>
<namespace:MainField3>MainValue3</namespace:MainField3>
这是由于stream 为Object[] result 中的每个元素返回JAXBElement 我想在完成循环子流后返回结果,如下所示:
private Object[] extensionBuilder(Map<String, Object> extensions) {
if (extensions == null) {
return null;
}
return extensions.entrySet().stream().flatMap(extension -> {
if (extension.getValue() instanceof Map) {
// return Stream of result transformed to JAXBElements
return Arrays.stream(extensionBuilder((Map) extension.getValue())).map(innerExtension -> {
System.out.println(innerExtension);
return new JAXBElement<JAXBElement>(new QName(getCleanLabel(extension.getKey())), JAXBElement.class, (JAXBElement) innerExtension);
});
} else {
return Stream.of(new JAXBElement<String>(new QName(getCleanLabel(extension.getKey())), String.class, extension.getValue().toString()));
}
}).filter(Objects::nonNull).collect(Collectors.toList()).toArray();
}
我试过这个,但这给我带来了错误java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class javax.xml.bind.JAXBElement。
有人可以帮助我修改Java Stream 以便获得预期的输出吗?
【问题讨论】:
标签: java arrays java-8 return java-stream