使用属性计算项目数
我有列表在哪里是这样的List<Custom>
Custom
class Custom{
public int id;
public String name;
}
如何获得名称为“汤姆”的项目数量?有没有比for循环更简单的方法?
我有列表在哪里是这样的List<Custom>
Custom
class Custom{
public int id;
public String name;
}
如何获得名称为“汤姆”的项目数量?有没有比for循环更简单的方法?
现在,这可以通过 Java 8 流轻松完成 — 无需额外的库。
List<Custom> list = /*...*/;
long numMatches = list.stream()
.filter(c -> "Tom".equals(c.name))
.count();
如果您要在多个位置按名称进行过滤,特别是如果您要将该过滤器与运行时确定的其他过滤器链接在一起,则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文档明确指出默认情况下应使用命令式样式。但无论如何,谓词都是一个很好的工具。