首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java - GroupBy框架

java - GroupBy框架
EN

Stack Overflow用户
提问于 2013-12-26 16:46:15
回答 3查看 230关注 0票数 2

在java中,我正在寻找一个框架来根据类的某些属性对POJO进行分组。

例如:编造的简单示例

代码语言:javascript
复制
Salary {
int userId;
Double salary;
String office;
}

聚合1:获取办公室的平均工资。

汇总2:所有工资的总和

汇总3:按办公室分列的工资总额

EN

回答 3

Stack Overflow用户

发布于 2013-12-26 17:26:20

您可以使用http://code.google.com/p/lambdaj/

关于Lambdaj:

lambdaj被设计成可以轻松地操作集合。它的功能旨在过滤、转换、索引和聚合集合中的项,而无需显式迭代。

对于您的示例;

Salary.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2013-12-26 17:26:14

使用Guava。它的Multimaps.index方法可以将POJO分组到一个多映射中。然后,您可以使用Maps.transformValues聚合这些多重贴图的值,以获得所需的结果。

票数 2
EN

Stack Overflow用户

发布于 2013-12-26 17:12:18

我认为你应该考虑两个框架myBatis和Hibernate。关于myBatis,我认为它适合你的情况,因为你可以直接写SQL语句,而且它也很容易支持将SQL结果通过xml文件映射到Java对象。MyBatis sample

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20781810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档