我有一个对象列表,如下所示,我想将它们按3个属性分组,并将第4个属性相加
public class DTO {
private final String at1;
private final String at2;
private final Integer at3;
private final BigDecimal amount;
}
我做了如下类似的事情,但它生成了许多地图,我无法得到求和的方法,因为它也需要一些逻辑
List<DTO> list = ...
Map<String, Map<String, Map<Integer, List<DTO>>>> groupedItems =
list.stream()
.collect(
Collectors.groupingBy(e -> e.getAt1(),
Collectors.groupingBy(e -> e.getAt2(),
Collectors.groupingBy( e -> e.getAt3()))));
如何使用和逻辑获取分组列表列表?
您可以创建一个构造函数来保存要分组的三个属性:
public DTO(String at1, String at2, Integer at3) {
this.at1 = at1;
this.at2 = at2;
this.at3 = at3;
}
然后您可以使用:
Map<DTO, BigDecimal> groupedItems = list.stream()
.collect(Collectors.groupingBy(e -> new DTO(e.getAt1(), e.getAt2(), e.getAt3()),
Collectors.reducing(
BigDecimal.ZERO,
DTO::getAmount,
BigDecimal::add)));
我假设您在DTO类中重写了equals和hashCode。
例子:
List<DTO> list = new ArrayList<>();
list.add(new DTO("a", "b", 1, BigDecimal.valueOf(10)));
list.add(new DTO("z", "y", 4, BigDecimal.valueOf(20)));
list.add(new DTO("a", "b", 1, BigDecimal.valueOf(30)));
list.add(new DTO("a", "b", 1, BigDecimal.valueOf(40)));
产出
DTO{at1='a', at2='b', at3=1, amount=null} - 80
DTO{at1='z', at2='y', at3=4, amount=null} - 20
哦,那些狡猾的Java8条带有lambdas的溪流。它们非常强大,但是复杂的东西需要一点时间来包裹它。 假设我有一个类型,其属性为。假设我有这些用户的地图 ?
我有一个按月-年字符串属性排序的对象列表。我的对象类定义如下 我想对会员人数、非会员人数、会员付款、非会员付款进行累计和 所以我的新对象列表如下 我尝试与但它给我所有的总和不累积。 非常感谢任何指点。
我想总结我的对象的属性。对象有这样的结构: 我已经将它们收集到一个列表中,并希望(使用streams)得到一个所有元素的列表,其中只包含名称以及价格和费用的总和。例如: 应导致以下结果:
我有一个类具有以下签名: 我想将映射到在单个流中同时包含stringA和stringB的 或: 当然他们都不编译,但你明白了。 编辑: 示例:
给java类一些东西 我有一张物品清单 我希望能够对它们进行排序,这样它们就可以按照每个父对象的虚数的累积和排序,然后再按照虚数排序。 所以我最终 我知道用parentKey和sum of noThings映射它是 我想,也许包装我的Something类并获得每个父项的总密钥可能会在某种程度上起作用。 但看起来工作量很大,不太优雅。 如有任何意见/想法,将不胜感激。
有许多java第三方库可用于在Java集合中提供高性能。根据这篇DZONE文章,有一些本机库遵循OSGI模型,并在Java集合中提供高性能,或者还执行一些其他操作。现在在中启动了以在集合库中提供良好的性能,我们还使用执行一些并行操作。现在,以下是我的问题: Java Streams的性能是否比第三方库(,等)更好。 是否可以将与其他集合库一起使用?