【问题标题】:Using java8 streams to prevent duplicate code使用 java8 流防止重复代码
【发布时间】:2017-09-25 00:57:22
【问题描述】:

我有这个对象列表 和

class ResultDto {
  private Integer field1;
  private Integer field2;
  ...etc
}

我想创建 2 个 ResultDto 对象。第一个包含 List 中所有 field1 的最大值,第二个包含 List 中所有 field1 的平均值。 field2 也是如此。

List<ResultDto>                          ResultDto
resultDto1      resultDto2          =>   resultDto
field1          field1              =>   field1=max(field1, field2)
field2          field2              =>   field2=average(field1,field2)

我在 ResultDto (35) 中有很多字段。

最好的方法是什么?在流或老式java中 现在我做这样的事情:

for (GetResultDto result : resultDtoList){

        moyValues.setMeanSpeed(moyValues.getMeanSpeed() != null ? moyValues.getMeanSpeed() + result.getMeanSpeed(): result.getMeanSpeed()) ;
        if(minValues.getMeanSpeed() == null) {minValues.setMeanSpeed(result.getMeanSpeed());}
        if(result.getMeanSpeed() > minValues.getMeanSpeed()) {minValues.setMeanSpeed(result.getMeanSpeed());}
        if(maxValues.getMeanSpeed() == null) {maxValues.setMeanSpeed(result.getMeanSpeed());}
        if(result.getMeanSpeed() > maxValues.getMeanSpeed()) {maxValues.setMeanSpeed(result.getMeanSpeed());}

        moyValues.setMaxSpeed(moyValues.getMaxSpeed() != null ? moyValues.getMaxSpeed() + result.getMaxSpeed() : result.getMaxSpeed()) ;
        if(minValues.getMaxSpeed() == null) {minValues.setMaxSpeed(result.getMaxSpeed());}
        if(result.getMaxSpeed() < minValues.getMaxSpeed()) {minValues.setMaxSpeed(result.getMaxSpeed());}
        if(maxValues.getMaxSpeed() == null) {maxValues.setMaxSpeed(result.getMaxSpeed());}
        if(result.getMaxSpeed() > maxValues.getMaxSpeed()) {maxValues.setMaxSpeed(result.getMaxSpeed());}

提前感谢您的帮助

【问题讨论】:

  • 流在这里有什么帮助?通过提取一些处理逻辑的方法,您可以使您的代码更加清晰。使用三元运算符只会让它看起来很糟糕。
  • 在流中,使用 IntSummaryStatistics
  • 你真的有 35 个独立的 Integer 字段吗?为什么不使用整数数组作为单个字段?

标签: java java-8 duplicates java-stream


【解决方案1】:

也许是这样的?

private static final List<ResultDto> results = new ArrayList<>(Arrays.asList(
        new ResultDto(1, 2),
        new ResultDto(3, 4)
));

public static void main(String[] args) {
    ResultDto resultDto1 = toResultDto(
            results.stream().collect(summarizingInt(dto -> dto.filed1)));
    ResultDto resultDto2 = toResultDto(
            results.stream().collect(summarizingInt(dto -> dto.filed2)));
}

private static ResultDto toResultDto(IntSummaryStatistics statistics) {
    return new ResultDto(statistics.getMax(), (int) statistics.getAverage());
}

【讨论】:

  • 这样,我将不得不循环遍历列表的次数与我拥有的字段数一样多。这是正确的吗 ?还是蒸汽会缓存列表?另外,我应该使用 parallelStream 以便获得更好的性能吗?谢谢
  • @batmaniac 如果您不想多次循环列表,您应该创建自己的收集器(这里有很多关于此的问题)
【解决方案2】:

您需要一些属性访问 lambda,例如

update(results, moyValues, minValues, maxValues, 
                v -> v.getMeanSpeed(), (v, x) -> v.setMeanSpeed(x));

使用这些 lambda,您应该能够替换所有 get 和 set 调用。

【讨论】:

    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2018-06-22
    相关资源
    最近更新 更多