问题陈述

在我的体系 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
  • 在同一调用中访问来自ABC的非列表成员,并在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

给定的对象包含基元类型+字符串作为成员,以及对象列表,而对象列表又包含基元类型+字符串作为成员以及对象列表-如何在单个调用中将它们流传输以检索基元类型+字符串在单个调用中涉及所有类型的元组?

我知道这很难恰当地表达出来,上面的例子应该会让事情变得清晰起来.

推荐答案

为了获得与classic 的for循环方法相同的结果,您需要使用flatMap.从您的对象中获取B的列表并在其上传输,通过调用getBList()平面图并获取每个B的每A个,然后将数据映射到一个新的D对象,最后收集到D个对象的列表.下面这样的内容应该会给你想要的东西

C c = someGetterForC();

List<D> dList = c.getCList()
                 .stream()
                 .flatMap(b -> b.getBList()
                                .stream()
                                .map(a -> new D(a.getA1(), b.getB1(), c.getC1(), c.getC2())))
                 .collect(Collectors.toList());

Java相关问答推荐

Java中是否有某种类型的池可以避免重复最近的算术运算?

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

将不受支持的时区UT重写为UTC是否节省?

名称冲突具有相同的擦除

如何确定springboot在将json字段转换为Dto时如何处理它?

基于调车场算法的科学计算器

由于我在Main方法中关闭了 scanner ,但在该方法中创建了一个新的 scanner ,因此出现了错误

为什么我的回收视图会显示重复的列表?

如何用内置Java从JavaFX应用程序中生成.exe文件?

为什么在下面的Java泛型方法中没有类型限制?

如果List是一个抽象接口,那么Collectors.toList()如何处理流呢?

将stringBuilder + forloop转换为stream + map

Kotlin-仅替换字符串中最后一个给定的字符串

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

当我将JTextField的getText函数与相等的String进行比较时;t返回true

Springboot应用程序无法识别任何@RestController或@Service,我认为@Repository也无法识别

类型安全:从 JSONArray 到 ArrayList> 的未经判断的转换

更新不可变的深层嵌套字段

我一直在用 Java 将一个非常大的二进制文件转换为 PNG

从 Java 中的列表中删除最后一个元素