【问题标题】:How to use conditional filter and map with stream()如何通过 stream() 使用条件过滤器和映射
【发布时间】:2019-08-26 20:48:31
【问题描述】:

我正在尝试流式传输 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(),但是我不确定如何在过滤器中使用条件并进行不同的映射。

有人可以帮忙吗。

【问题讨论】:

  • 所以你有一个A 对象的列表,并且你想通过它进行流式传输,并获取BactualValue 属性并将其设置为A 的@ 987654331@ 对吗?但是没有一个字段是static,所以每个对象actualValue 可以不同。您想从哪个对象中获取actualValue
  • 在将它们映射到不同的对象之后,您的最终意图是什么?您想对它们做什么,将它们存储在不同的绿色、黄色等列表中?
  • 好的,遍历它们并使用转换器方法映射它们。旁白:在目前的情况下,不同颜色类别的存在没有多大意义。您可以简单地拥有一个 class Color {private Integer actualValue; private Integer expectedValue;},然后在 B 中将其用作 public class B { private Color green; private Color yellow; private Color red; },这将需要一个转换器来转换这些值,并且在将它们设置为属性时,您可以根据 color 值匹配它.
  • 为什么会有多个具有相同结构的类?此外,这些都没有任何意义。
  • 如果你有 3 个As,你为什么要流过它们?只需按程序进行即可。

标签: java java-8 mapping java-stream


【解决方案1】:

构建单个B 实例不是适合“Classes to support functional-style operations on streams of elements, such as map-reduce transformations on collections.”的任务。但是,当您的输入是 ListA 元素时,这对于您的任务来说并不是一个很好的输入,您可以使用 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 具有相同的结构和行为,那么您是否真的需要为它们设置不同的类是值得怀疑的。只有在某些情况下,语义差异可能值得将它们分开以防止它们混淆(我假设,您的问题代码是一个简化的示例)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多