Возможно ли это сделать? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть список вложенных классов.Могу ли я использовать потоки для их перемещения, и когда условие истинно, мне нужно напечатать все значения.

Ввод: список ObjDS;

Вместо того, чтобы использовать циклы или итератор, можем ли мы использовать потокипройти и когда d1 + d2 Obj4 в каждом равен некоторому числу (скажем, 10), то выведите a1, a2, b1, b2, c1, c2, d1, d2 иерархии.

Является ли этоможно делать с потоками?

public class ObjA {
    int a1;
    int a2;
}

public class ObjB {
    int b1;
    int b2;
    List<ObjA> objAS;
}

public class ObjC {
    int c1;
    int c2;
    List<ObjB> objBS;
}

public class ObjD {
    int d1;
    int d2;
    List<ObjC> objCS;
}

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Я думаю, вам нужно более подробно указать ваши требования.В моем понимании вы не можете просто напечатать abcd, но вместо этого хотите напечатать целое дерево под d.Самый простой способ, о котором я могу подумать на первый взгляд, таков:

ds  .stream()
    .filter(d -> d.d1 + d.d2 == sum)
    .peek(d -> System.out.println(d.d1 + " " + d.d2))
    .flatMap(d -> d.objCS.stream())
    .peek(c -> System.out.println(" " + c.c1 + " " + c.c2))
    .flatMap(c -> c.objBS.stream())
    .peek(b -> System.out.println("  " + b.b1 + " " + b.b2))
    .flatMap(b -> b.objAS.stream())
    .forEach(a -> System.out.println("   " + a.a1 + " " + a.a2));

Возможно, вы захотите подумать об использовании некоторого общего суперкласса, чтобы сделать этот код менее избыточным ( составной шаблон ).Вы также можете написать методы печати, которые вызывают друг друга (например, вы вызываете objD.print(), который печатает d1 и d2, а затем вызывает objCS.foreach(ObjC::print()), что, в свою очередь ...). Алгоритмы обхода дерева также может быть хорошим чтением.

0 голосов
/ 04 июля 2019

Конечно, это возможно.

ПРИМЕЧАНИЕ : Из вашего вопроса я понял, что вы хотите напечатать все поля всех объектов внутри объекта ObjD, где ObjD.d1 + ObjD.d2 равен некоторой конкретной сумме.Надеюсь, я правильно понял ваш запрос.

На самом деле это легко сделать с помощью метода фильтра из Streams API.

Код будет выглядеть примерно так:

int sum = 10;
objDS.stream()
     .filter(objD -> objD.d1 + objD.d2 == sum)
     .forEach(objD -> {
         List<ObjC> objCS = objD.objCS;
         objCS.forEach(objC -> {
             List<ObjB> objBS = objC.objBS;
             objBS.forEach(objB -> {
                 List<ObjA> objAS = objB.objAS;
                 objAS.forEach(objA -> {
                     System.out.println("ObjA.a1: " + objA.a1);
                     System.out.println("ObjA.a2: " + objA.a2);
                 });
                 System.out.println("ObjB.b1: " + objB.b1);
                 System.out.println("ObjB.b2: " + objB.b2);
             });
             System.out.println("ObjC.c1: " + objC.c1);
             System.out.println("ObjC.c1: " + objC.c1);
         });
         System.out.println("ObjD.d1: " + objD.d1);
         System.out.println("ObjD.d2: " + objD.d2);
     });

Здесь я использую переменную суммы, чтобы проверить условие, которое вы упомянули.После того как список ObjD отфильтрован, у нас есть только объекты, у которых ObjD.d1 + ObjD.d2 равен сумме.

Кроме того, мы можем просто использовать метод forEach () для итерации по каждому списку и в соответствии с вашимпредпочтение печати переменных в любом порядке, который вы хотите.

Здесь я начну с печати внутреннего списка ObjAS, за которым следуют ObjBS, ObjCS и ObjDS.

Вы можете изменить порядок в соответствии с вашими требованиями.

...