使用java转换为Lambda表达式?

2 java java-stream

我正在学习 lambda 表达式。我正在尝试计算值。

这是示例:

double sendersCount = 0.0;
double reciversCount = 0.0;
for(RecordDTO record : records){
   if("1".equals(record.getSendersId())) {
     sendersCount += record.getCount().doubleValue();
   } else {
     reciversCount +=  record.getCount().doubleValue();
   }
}

class Record{

private String id;
private BigDecimal count;
private String senderId;

//setters
//getters
}
Run Code Online (Sandbox Code Playgroud)

我们如何使用Streams和maps来实现?

Nam*_*man 6

以一种方式,您可以将列表分区,然后sum将适当的属性分区为 -

Map<Boolean, List<Record>> partitioned = records.stream()
        .collect(Collectors.partitioningBy(rec -> rec.getSendersId().equals("1")));

double sendersCount = partitioned.get(Boolean.TRUE).stream()
        .mapToDouble(Record::getSendersCount).sum();
double receiversCount = partitioned.get(Boolean.FALSE).stream()
        .mapToDouble(Record::getReceiversCount).sum();
Run Code Online (Sandbox Code Playgroud)

或者正如 Ousmane 指出的那样,您可以使用summingDouble带有条件的下游进行映射,例如:

Map<Boolean, Double> summingValue = records.stream()
        .collect(Collectors.partitioningBy(r -> "1".equals(r.getSendersId()),
                Collectors.summingDouble(r -> "1".equals(r.getSendersId()) ?
                        r.getSendersCount() : r.getReceiversCount())));
Run Code Online (Sandbox Code Playgroud)