在java中,我正在寻找一个框架来根据类的某些属性对POJO进行分组。
例如:编造的简单示例
Salary {
int userId;
Double salary;
String office;
}聚合1:获取办公室的平均工资。
汇总2:所有工资的总和
汇总3:按办公室分列的工资总额
发布于 2013-12-26 17:26:20
您可以使用http://code.google.com/p/lambdaj/
关于Lambdaj:
lambdaj被设计成可以轻松地操作集合。它的功能旨在过滤、转换、索引和聚合集合中的项,而无需显式迭代。
对于您的示例;
Salary.java
package x;
public class Salary {
int userId;
Double salary;
String office;
public Salary(int userId, Double salary, String office) {
super();
this.userId = userId;
this.salary = salary;
this.office = office;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public String getOffice() {
return office;
}
public void setOffice(String office) {
this.office = office;
}
}LambdaX.java
package x;
import java.util.ArrayList;
import java.util.List;
import org.hamcrest.Matchers;
import static ch.lambdaj.Lambda.*;
public class LambdajX {
public static void main(String[] args) {
List<Salary> salaries = new ArrayList<Salary>();
salaries.add(new Salary(1, 100.0, "mexico"));
salaries.add(new Salary(2, 130.0, "germany"));
salaries.add(new Salary(3, 190.0, "mexico"));
LambdajX lambdajX = new LambdajX();
System.out.println("Total Salary : "
+ lambdajX.getAggregateSalary(salaries));
System.out.println("Total Salary in Mexico : "
+ lambdajX.getAggregateSalaryByOffice(salaries, "mexico"));
System.out.println("Avg Salary : "
+ lambdajX.getAverageSalary(salaries));
System.out.println("Avg Salary in Mexico :"
+ lambdajX.getAverageSalaryByOffice(salaries, "mexico"));
}
public Double getAggregateSalary(List<Salary> salaries) {
return sum(salaries, on(Salary.class).getSalary());
}
public Double getAggregateSalaryByOffice(List<Salary> salaries,
String office) {
return sumFrom(
select(salaries,
having(on(Salary.class).getOffice(),
Matchers.equalTo(office)))).getSalary();
}
public Double getAverageSalary(List<Salary> salaries) {
return avg(salaries, on(Salary.class).getSalary());
}
public Double getAverageSalaryByOffice(List<Salary> salaries, String office) {
return avgFrom(
select(salaries,
having(on(Salary.class).getOffice(),
Matchers.equalTo("mexico")))).getSalary();
}
}使用的库: lambdaj-2.4-with-dependencies.jar
您可以从http://lambdaj.googlecode.com/files/lambdaj-2.4-with-dependencies.jar下载此jar文件
另一种选择是谷歌的Guava。
发布于 2013-12-26 17:26:14
使用Guava。它的Multimaps.index方法可以将POJO分组到一个多映射中。然后,您可以使用Maps.transformValues聚合这些多重贴图的值,以获得所需的结果。
发布于 2013-12-26 17:12:18
我认为你应该考虑两个框架myBatis和Hibernate。关于myBatis,我认为它适合你的情况,因为你可以直接写SQL语句,而且它也很容易支持将SQL结果通过xml文件映射到Java对象。MyBatis sample
https://stackoverflow.com/questions/20781810
复制相似问题