3 回答
TA贡献1825条经验 获得超4个赞
通过您的map
电话,您正在将您转换Stream<Customer>
为Stream<Boolean>
关于您的活跃和非活跃客户的正确和错误的流。您不能getBillingCount
在布尔值上调用 Customer's。
您可以使用收集partitioningBy
器按布尔值进行分组,而无需事先map
调用。下游收集器可以是同时收集总和和平均值的summarizingInt
收集器(加上一些您可能不需要的其他收集器:计数、最大值、最小值)。
Map<Boolean, Integer> stats = customer.stream() .collect(Collectors.partitioningBy(Customer::getIsActive, Collectors.summarizingInt(Customer::getBillingCount)));
这应该让您在一个声明中true
获得统计数据。false
TA贡献1812条经验 获得超5个赞
您不需要使用map. 请参见下面的示例:
List<Customer> customers = Arrays.asList(
new Customer(10, true, 5),
new Customer(11, true, 3),
new Customer(20, false, 12),
new Customer(21, false, 11));
Map<Boolean, Integer> sum = customers
.stream()
.collect(Collectors.groupingBy(Customer::isActive, Collectors.summingInt(Customer::getBillingCount)));
System.out.println(sum);
Map<Boolean, Double> avg = customers
.stream()
.collect(Collectors.groupingBy(Customer::isActive, Collectors.averagingInt(Customer::getBillingCount)));
System.out.println(avg);
上面的代码打印:
{false=23, true=8}
{false=11.5, true=4.0}
TA贡献1844条经验 获得超8个赞
你真的需要一张活跃和不活跃的地图吗?简单地说:
IntSummaryStatistics summaryActive = customer.stream()
.filter(Customer::getIsActive)
.mapToInt(Customer::getBillingCount)
.summaryStatistics();
long sumActive = summary.getSum();
double averageActive = summary.getAverage();
您可以通过将过滤器替换为非活动来执行相同的操作.filter(c -> !c.getIsActive())
添加回答
举报