当前位置: 首页 > 知识库问答 >
问题:

按文件分组并计算Java8[duplicate]中的非空字段

范云
2023-03-14

我尝试使用Java8特性。

我有课

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

我有一个列表,我尝试按PID分组,并计算非空的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的,我面临着要完成它的斗争,我尽了最大的努力。是否可以删除空文件和计数?

共有1个答案

澹台展鹏
2023-03-14

你能试试下面的解决方案吗?它将提供正确的输出:

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        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")
                );

        Set<Stat> set = list.stream().map(s -> new Stat(s.getPId(), 0, 0)).collect(Collectors.toSet());
        set = set.stream().map(s -> updateCounts(list, s.getPId())).collect(Collectors.toSet());

        System.out.println(set);
    }

    public static Stat updateCounts(List<User> list, String pId) {
        Long uCount = list.stream().filter(s -> pId.equals(s.getPId()) && Objects.nonNull(s.getUId()))
            .collect(Collectors.counting());

        Long priceCount = list.stream().filter(s -> pId.equals(s.getPId()) && Objects.nonNull(s.getPrice()))
                .collect(Collectors.counting());
        return new Stat(pId, Integer.valueOf(uCount+""), Integer.valueOf(priceCount+""));
    }
}
 类似资料:
  • 我尝试使用Java8特性。 我有课 我的最后一个映射类是 因为我是刚到java的,我面临着要完成它的斗争,我尽了最大的努力。是否可以删除空文件和计数?提前致谢

  • 问题内容: 我有一个数据库: 我想选择所有条目,但有一个例外: 与的所有条目均应分组 *与的 *最后一个条目应在之后 这是我期望的结果: 到目前为止,我已经做到了这一点(注意:“ change_count” = COUNT): 那就是我得到的: 如您所见,结果有两个问题: 条目按首次出现分组(应为last(最新)) 也被分组(不应该被分组) 我上面描述的任务可以实现吗?我该怎么做? 编辑: 问题答

  • 问题内容: 我有一个包含用户数据的类,如下所示: 我需要计算非字段,以显示用户已填充的配置文件的百分比。还有一些,我不希望在百分比计算要考虑几个字段:,和。 一种简单的方法是使用多个语句来获取非null字段,但这将涉及大量样板代码,并且还有一个我需要显示完成百分比的类。因此,我创建了一个实用程序函数,如下所示: 然后我按如下所示调用此函数: 我的问题是,这是我不算数字段还是可以进一步改进的最佳方法

  • 问题内容: 我从这样的数据库中提取了数据(为简单起见,将其简化),我想添加一个称为“百分比”的列。 先感谢您 问题答案: 内部选择得到s的和。

  • 问题内容: 我的ElasticSearch 6.5.2索引看起来像: 我想要一个返回此结果的查询: 我只想按发生次数分组并获取每个事件的数量,最多只能有十个数字。我尝试使用聚合,但存储桶为空。谢谢! 问题答案: 案例映射 您的查询应如下所示 您应该添加以启用聚集 文本 类型的字段更多的是 在与@Kamal简短讨论之后,我有义务告诉您,如果选择启用,则必须知道它会占用大量堆空间。 通过我分享的链接:

  • 问题内容: (如果标题更好,请进行编辑,我无法正确解释!:)这是我的代码: 这是: 我应该打印出使用过的字母以及使用了多少次,我的代码可以正常工作,但是我需要按字母顺序排列,我尝试将它们放在列表中然后进行排序,但是我不太明白想法?提前致谢! 问题答案: 每当进行计数时,您都可以在这里使用: 如果您无法导入任何模块,则可以追加到列表中然后对其进行排序: 或者,使用列表推导: 最后,要对其进行排序,只