我正在尝试流式传输类型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()
,但是我不确定如何在过滤器中使用条件并执行不同的映射。
有人可以帮忙吗?
答案 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()));
请注意,如果Red
,Green
和Yellow
具有相同的结构和行为,则是否确实需要不同的类是有问题的。仅在某些情况下,值得将语义上的差异分开以防止混淆(我假设您的问题的代码是一个简化的示例)。