Как использовать условный фильтр и карту с потоком () - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь передать List типа A и, основываясь на условиях, сопоставить их с другим объектом типа B.

Ниже приведена структура моих классов.

public class A {
       private String   color;
       private Integer  actualValue;
       private Integer  expectedValue;
}

public class B {
       private Green green;
       private Yellow yellow;
       private Red red;
}


public class Green {
       private Integer  actualValue;
       private Integer  expectedValue;
}

... и та же структура класса Green, а также класса Yellow и Red.

Я ожидаю использовать один listA.stream() и выполнить приведенное ниже отображение:

if(colorFromListA.equals("green") {
  //then set the "actualValue" from ListA to "actualValue" of 
    Class Green
}
else if (colorFromListA.equals("yellow") {
  //then set the "actualValue" from ListA to "actualValue" of Class Yellow
}

.... и т. д.

Я пытался использовать .filter() и .map(), но я не уверен, как использовать условия в фильтре и выполнять различные сопоставления.

Может кто-нибудь, пожалуйста, помогите.

1 Ответ

0 голосов
/ 05 апреля 2019

Создание отдельного экземпляра B не является задачей, подходящей для « Классов для поддержки операций функционального стиля над потоками элементов, таких как преобразования с уменьшением карты в коллекциях. ». Тем не менее, когда ваши входные данные представляют собой List из A элементов, что на самом деле не является хорошим входом для вашей задачи, вы можете использовать Stream API для этапа подготовки:

Map<String, A> colorToA = listOfA.stream()
    .collect(Collectors.toMap(A::getColor, Function.identity()));

if(colorToA.size() != 3 ||
   !colorToA.keySet().containsAll(Arrays.asList("red", "green", "yellow")))
    throw new IllegalArgumentException("expected [\"red\", \"green\", \"yellow\"],"
                                     + " but got "+colorToA.keySet());

B b = new B(new Red(   colorToA.get("red")   .getActualValue()),
            new Green( colorToA.get("green") .getActualValue()),
            new Yellow(colorToA.get("yellow").getActualValue()));

Обратите внимание, что если Red, Green и Yellow имеют одинаковую структуру и поведение, сомнительно, действительно ли вам нужны разные классы для них. Только в некоторых случаях семантическое различие может стоить разделить их, чтобы не перепутать их (я полагаю, код вашего вопроса - упрощенный пример).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...