Java 8 - 在同一流代码中更新两个属性

我想知道是否有一种方法可以更新 Stream lambda 代码中的对象两次,我需要更新一个类的两个属性,我需要更新 valuerecordsCount 属性

对象:

public class HistoricDataModelParsed {

private Date   startDate;
private Date   endDate;
private Double value;
private int    recordsCount;

}

我尝试做这样的事情:

val existingRecord = response.stream()
     .filter(dateTime ->fromDate.equals(dateTime.getStartDate()))
     .findAny()
     .orElse(null);


response.stream()
     .filter(dateTime ->fromDate.equals(dateTime.getStartDate()))
     .findAny()
     .orElse(existingRecord)
     .setvalue(valueAdded)
     .setRecordsCount(amount);

但我收到此错误:“无法在原始类型 void 上调用 setRecordsCount(int)

所以我最终做了两次流来更新我需要的两个字段中的每一个

response.stream()
     .filter(dateTime ->fromDate.equals(dateTime.getStartDate()))
     .findAny()
     .orElse(existingRecord)
     .setvalue(valueAdded);
                
 response.stream()
     .filter(dateTime ->fromDate.equals(dateTime.getStartDate()))
     .findAny()
     .orElse(existingRecord)
     .setRecordsCount(amount);      

有没有一种方法可以实现我需要的内容,而无需流式传输列表的两倍?

mjc151767 回答:Java 8 - 在同一流代码中更新两个属性

对象的状态不应在流中改变。它可能导致不一致的结果。但是您可以创建对象的新实例并通过构造函数传递新值。这是演示该方法的简单记录。记录基本上是没有 setter 的不可变类。 getter 是变量的名称。一个类也适用于这个例子。

record Temp(int getA,int getB) {
    @Override
    public String toString() {
        return "[" + getA + "," + getB  +"]";
    }
}

一些数据

    List<Temp> list = List.of(new Temp(10,20),new Temp(50,200),new Temp(100,200));

还有转型。带有新值的 Temp 的新实例与旧值一起创建以完全填充构造函数。否则,将传递现有对象。

List<Temp> result = list.stream().map(
        t -> t.getA() == 50 ? new Temp(2000,t.getB()) : t)
        .toList();

System.out.println(result);

印刷品

[[10,20],[2000,200],[100,200]]

要回答 void 错误,你得到它是因为流期望值继续通过流,所以如果一个方法是空的,它不会返回任何东西,所以你必须返回它。下面是一个例子:

stream.map(t->{voidReturnMethod(t); return t;}).toList();

返回确保管道继续。

,

只需存储 orElse 的结果,然后在其上调用您的方法。

HistoricDataModelParsed record = 
    response.stream()
        .filter(dateTime -> fromDate.equals(dateTime.getStartDate()))
        .findAny()
        .orElse(existingRecord);

record.setValue(valueAdded)
record.setRecordsCount(amount);
,

setValue 的返回类型是 void不是 HistoricDataModelParsed。所以你不能调用 setRecordsCount 类中的方法 HistoricDataModelParsed

您可以在 HistoricDataModelParsed 中添加一个方法,它为 valuerecordsCount 提供两个参数:

public void setValueAndCount(Double value,int count) {
    this.value = value;
    this.recordsCount = count;
}

然后在orElse之后调用这个方法:

response.stream()
     .filter(dateTime ->fromDate.equals(dateTime.getStartDate()))
     .findAny()
     .orElse(existingRecord)
     .setValueAndCount(valueAdded,amount);
本文链接:https://www.f2er.com/7784.html

大家都在问