我有列表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)
如果您要在多个位置按名称进行过滤,特别是如果要将该过滤器与运行时确定的其他过滤器相关联,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文档明确指出默认情况下应该使用命令式样式.但是谓词无论如何都是一个很好的工具.