问题陈述
在我的体系 struct 中,有一些我打算以 struct 化方式显示的数据对象.这些对象如下所示:
public class A
{
private final String a1;
public A( String a1 )
{
this.a1 = a1;
}
public String getA1()
{
return a1;
}
}
public class B
{
private final String b1;
private final List<A> bList;
public B( String b1, List<A> list )
{
this.b1 = b1;
this.bList = list;
}
public String getB1()
{
return b1;
}
public List<A> getBList()
{
return bList;
}
}
public class C
{
private final String c1;
private final int c2;
private final List<B> cList;
public C( String c1, int c2, List<B> list )
{
this.c1 = c1;
this.c2 = c2;
this.cList = list;
}
public String getC1()
{
return c1;
}
public int getC2()
{
return c2;
}
public List<B> getCList()
{
return cList;
}
}
因此,对象C
保存一些值,以及对象B
的列表和那些对象B
分别保存它们自己的一些值以及对象A
的列表,这些对象A
本身又保存一些值.
我试图遵守的要求是putting these into a JSON structure,也是create a list of objects, where every entry looks like a collection of all of those data properties in a single object.后者应该是这样的:
public class D
{
public final String a1;
public final String b1;
public final String c1;
public final int c2;
public D( String a1, String b1, String c1, int c2 )
{
this.a1 = a1;
this.b1 = b1;
this.c1 = c1;
this.c2 = c2;
}
}
宣布的目标是在List<D>
秒内收集这些数据.
到目前为止我的解决方案
使用Jackson可以很容易地实现JSON struct :
C c = someGetterForC();
ObjectMapper mapper = new ObjectMapper();
mapper.enable( SerializationFeature.INDENT_OUTPUT );
try
{
return mapper.writeValueAsString( c );
}
catch( JsonProcessingException e )
{
// do error handling here
}
这为我提供了一个格式良好的JSON字符串,并符合第一个要求.对于第二个需求,我最初使用了一种非常简单的方法,i.e.简单地收集for
个循环中的所有数据,从而创建D
的实例并将它们放在列表中.这看起来有点像这样:
List<D> dList = new ArrayList<>();
C c = someGetterForC();
for( B b : c.getCList() )
{
for( A a : b.getBList() )
{
D d = new D( a.getA1(), b.getB1(), c.getC1(), c.getC2() )
dList.add( d );
}
}
然而,我想学习如何使用Java-Streams来创建D
个实例,因为我仍然不能理解它的一些概念.我面临的斗争是
- 在对象
B
的流列表之后流送对象列表A
- 在同一调用中访问来自
A
、B
和C
的非列表成员,并在D
的实例中收集它们
Can this be done in a single stream-API call, i.e.个
C c = someGetterForC();
c.stream()
// how to continue?
and if so, does it make sense to do so?个
备注
- Java 11是必填项,该项目目前无法访问较新的Java数据 struct
- 在给定
for
个循环的情况下,D
的实例中将存在冗余数据,这一事实并不重要,也不是有意的
示例
假设存在保持以下内容的对象C c_alpha
:
c1 = "car"
c2 = 42;
cList = {b_alpha, b_beta}
其中,B b_alpha
表示:
b1 = "boulder"
bList = {a_alpha}
而B b_beta
则表示:
b1 = "bomb"
bList = {a_beta, a_gamma}
最后是剩余的A
个对象类型,A a_alpha
个对象:
a1 = "ape"
A a_beta
个支持:
a1 = "andromeda"
而A a_gamma
则表示:
a1 = "axe"
那么,我试图通过利用流API获取的对象D
的收集列表应该如下所示:
{ "42", "car", "boulder", "ape" },
{ "42", "car", "bomb", "andromeda" },
{ "42", "car", "bomb", "axe" },
TL;DR
给定的对象包含基元类型+字符串作为成员,以及对象列表,而对象列表又包含基元类型+字符串作为成员以及对象列表-如何在单个调用中将它们流传输以检索基元类型+字符串在单个调用中涉及所有类型的元组?
我知道这很难恰当地表达出来,上面的例子应该会让事情变得清晰起来.