计算具有财产的物品数量

Dam*_*mir 11 java list

我有列表List<Custom>,其中Custom

class Custom{
    public int id;
    public String name;
}
Run Code Online (Sandbox Code Playgroud)

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

mat*_*vei 13

现在可以使用Java 8流轻松完成 - 无需额外的库.

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

  • 需要注意的是 c -&gt; 后面的值始终是布尔值 (3认同)

Ant*_*oly 5

如果您要在多个位置按名称进行过滤,特别是如果要将该过滤器与运行时确定的其他过滤器相关联,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);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

一旦编码了该谓词,过滤和计数将只需要一行代码.

int size = Collections2.filter(customList, nameIs("Tom")).size();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,与循环(命令式样式)相比,谓词(函数式)的冗长构造并不总是更易读,更快或者保存代码行.实际上,Guava文档明确指出默认情况下应该使用命令式样式.但是谓词无论如何都是一个很好的工具.


Jan*_*nke 2

标准集合没有更简单的解决方案。您必须遍历列表并计算名称的出现次数。