使用属性计算项目数

2022-09-04 05:45:09

我有列表在哪里是这样的List<Custom>Custom

class Custom{
    public int id;
    public String name;
}

如何获得名称为“汤姆”的项目数量?有没有比for循环更简单的方法?


答案 1

现在,这可以通过 Java 8 流轻松完成 — 无需额外的库。

List<Custom> list = /*...*/;
long numMatches = list.stream()
                      .filter(c -> "Tom".equals(c.name))
                      .count();

答案 2

如果您要在多个位置按名称进行过滤,特别是如果您要将该过滤器与运行时确定的其他过滤器链接在一起,则Google Guava谓词可能会对您有所帮助:

public static Predicate<Custom> nameIs(final String name) {
    return new Predicate<Custom>() {
        @Override public boolean apply(Custom t) {
            return t.name.equals(name);
        }
    };
}

对该谓词进行编码后,筛选和计数将只需要一行代码。

int size = Collections2.filter(customList, nameIs("Tom")).size();

如您所见,与循环(命令式样式)相比,谓词(函数式样式)的详细构造并不总是更具可读性,更快或节省代码行。实际上,Guava文档明确指出默认情况下应使用命令式样式。但无论如何,谓词都是一个很好的工具。