java - 按字段分组并计算 java 8 中的非空字段

标签 java collections java-8 java-stream

<分区>

我尝试使用 java 8 功能。

我有课

@Data
@NoArgsConstructor
@AllArgsConstructor
class User {
    private String pId;
    private String uId;
    private String price;
}

我有一个列表,我尝试按 pId 分组并计算非 null uIdprice。示例:

List<User> list =
Arrays.asList(
    new User ("p1", "u1", null),
    new User ("p1", "u2", "a"),
    new User ("p2", null, "b"),
    new User ("p2", null, "c"),
    new User ("p3", "u4", "d")
);

我的预期输出是

[
    { pId:"p1", uCount:2, priceCount:1 },
    { pId:"p2", uCount:0, priceCount:2 },
    { pId:"p3", uCount:1, priceCount:1 }
]

我试过喜欢下面

Map<String, Map<Object, Long>> collect =
    list.stream()
        .collect(
            Collectors.groupingBy(
                User ::getPId,
                Collectors.groupingBy(f -> f.getUId(), Collectors.counting())));

我的最终映射类是

@Data
@NoArgsConstructor
@AllArgsConstructor
class Stat {
    private String pId;
    private Integer uCount;
    private Integer priceCount;
}

由于我是 java 的新手,我面临着完成它的困难,我尽力了。是否可以删除空字段并计数?

最佳答案

Java 12+ 解决方案

通过使用teeing 收集器和过滤,您可以这样做:

Map<String, Detail> result = list.stream()
       .collect(Collectors.groupingBy(User::getpId, Collectors.teeing(
           Collectors.filtering(u -> u.getuId() != null, Collectors.counting()),
           Collectors.filtering(u -> u.getPrice() != null, Collectors.counting()),
           (uCount, priceCount) -> new Detail(uCount, priceCount)
        )));

class Detail{
  private long uCount;
  private long priceCount;
}

输出:

{ p1=Detail{uCount=2, priceCount=1}, p2=Detail{uCount=0, priceCount=2}, p3=Detail{uCount=1, priceCount=1} }

关于java - 按字段分组并计算 java 8 中的非空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67770861/

相关文章:

java - 使用 Guice servlet 路由子路径

java - 为什么仅在 Android 4 中出现 java.lang.Object[] cannot be cast to java.lang.String[][] 错误?

java - 为什么我们应该使用接口(interface)而不是具体类型?

java - Android 库不适用于 Java 8

java - 使用 Collectors 执行 flatMap 操作

java - 安卓 OpenCV : No resource identifier found for attribute 'camera_id' in package

java - 从打印循环中排除日期

c# - GetConsumingEnumerable 实际上是否从 BlockingCollection 中删除了一个项目?

java - 正确使用带有自定义类的哈希表

java - Akka ActorSystem 在 Java 中永远不会终止