如何使用条件过滤器并通过stream()进行映射

时间:2019-04-05 01:30:38

标签: java java-8 mapping java-stream

我正在尝试流式传输类型A的List,并根据条件将其映射到类型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 :(得分:0)

构造单个B实例不是适合“ Classes to support functional-style operations on streams of elements, such as map-reduce transformations on collections.”的任务。但是,如果您的输入是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()));

请注意,如果RedGreenYellow具有相同的结构和行为,则是否确实需要不同的类是有问题的。仅在某些情况下,值得将语义上的差异分开以防止混淆(我假设您的问题的代码是一个简化的示例)。