datatable java排序,Java实现DataTable的过滤,排序,聚合功能

用过C#的知道, 在.net环境下的有个DataTable对象,数据处理非常方便和强大. 可惜Java本身并没有提供这样的类。

在monalisa-db中提供了一个Java版本的DataTable, 可以把DataTable当中一个数据库表来看待,能够使用SQL语法对表内的数据做过滤,排序,count/sum/avg, group,join等, 操作起来也很方便, 不妨试用一下。

详细示例参考: https://github.com/11039850/monalisa-example

Maven 引用:

com.tsc9526

monalisa-core

1.1.2

1.[代码][Java]代码

//例子1: 从数据库查询出一个DataTable

DataTable users=User.SELECT().select();

DataTable results=users.select(

"name, count(*) as cnt"

,"status >= 0"

,"name asc"

,"name");

//对TableData的过滤操作,执行效果和下面的SQL相同

//SELECT name ,count(*) FROM _THIS_TABLE

// WHERE status >=0

// GROUP BY name

// ORDER by name ASC

2.[代码][Java]代码

//例子2: 自定义数据

DataTable table = new DataTable();

//创建测试数据

for(int userId=1;userId<=6;userId++){

DataMap row = new DataMap();

row.put("user", userId);

row.put("area", "guangdong-"+(userId%2));

row.put("rank" ,90+userId);

table.add(row);

}

DataMap r=table.selectOne("count(*) as cnt", "rank > 91", null, null);

System.out.println(r);

//输出: {cnt=5}

DataTable rs=table.select(

//字段选择: 支持常用的SQL聚合函数:sum/avg/count

//(null 或 "" 表示 *)

"area,count(*) as cnt"

//过滤条件: 支持AND, OR , 括号

//(null 或 "" 表示无条件)

, "rank>0"

//排序字段:ASC/DESC

//(null 或 "" 表示无指定的排序)

,"area ASC"

//分组语句:GROUP BY ... HAVING ...

//(null 或 "" 表示无分组)

,"area");

System.out.println(rs);

//输出:[{area=guangdong-0, cnt=3}, {area=guangdong-1, cnt=3}]

3.[代码][Java]代码

//例子3: Join

DataTable t1 = new DataTable();

t1.add(new User().setName("zzg1").setStatus(1));

t1.add(new User().setName("zzg2").setStatus(1));

t1.add(new User().setName("zzg3").setStatus(1));

DataTable t2 = new DataTable();

for(int i=0;i<2;i++){

DataMap row = new DataMap();

row.put("name", "zzg"+i);

row.put("age" ,16+i); //新字段

t2.add(row);

}

DataTable ts=

t1.join(t2, "name","name")//用字段name连接2个表 t1,t2;

.select(null, "age>0","age",null); //过滤 出age>0,并按age升序

System.out.println(ts);

/*输出如下:

[

{name=zzg1, status=1 , name1=zzg1, age=17}

]

*/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DataTable 是 ADO.NET 里面的一个重要概念,它代表着一张数据表,可以对其中的数据进行操作。在 Java 中,虽然没有官方的 DataTable 类,但是我们可以通过编写代码来实现一个类似的对象。 下面,我将介绍一下如何在 Java实现 DataTable 对象。 1. 创建 DataTable 类 首先,我们需要创建一个 DataTable 类来代表数据表。这个类应该具有以下基本属性: - 表名:代表数据表的名称。 - 列名:代表数据表中的列名。 - 行数据:代表数据表中的行数据。 代码如下: ```java public class DataTable { private String tableName; private List<String> columnNames; private List<List<Object>> rows; public DataTable(String tableName, List<String> columnNames) { this.tableName = tableName; this.columnNames = columnNames; this.rows = new ArrayList<>(); } // 省略 get/set 方法 } ``` 2. 添加数据 接下来,我们需要添加数据到数据表中。我们可以提供一个 addRow 方法来添加一行数据。这个方法需要接受一个 List<Object> 参数,代表一行数据。在该方法中,我们可以将这一行数据添加到 rows 列表中。 代码如下: ```java public void addRow(List<Object> rowData) { this.rows.add(rowData); } ``` 3. 获取数据 为了获取数据表中的数据,我们可以提供一个 getRows 方法来获取所有的行数据。该方法返回一个 List<List<Object>> 类型的数据。 代码如下: ```java public List<List<Object>> getRows() { return this.rows; } ``` 4. 查询数据 为了查询数据表中的数据,我们可以提供一个 select 方法来根据条件查询数据。该方法接受一个 Predicate<List<Object>> 类型的参数,代表查询条件。在该方法中,我们可以使用 Java 8 的 Stream API 来筛选符合条件的数据。 代码如下: ```java public List<List<Object>> select(Predicate<List<Object>> predicate) { return this.rows.stream().filter(predicate).collect(Collectors.toList()); } ``` 5. 更新数据 为了更新数据表中的数据,我们可以提供一个 update 方法来更新符合条件的数据。该方法需要接受一个 Predicate<List<Object>> 类型的参数,代表更新条件,以及一个 Consumer<List<Object>> 类型的参数,代表更新操作。在该方法中,我们可以使用 Java 8 的 Stream API 来筛选符合条件的数据,并进行更新操作。 代码如下: ```java public void update(Predicate<List<Object>> predicate, Consumer<List<Object>> updater) { this.rows.stream().filter(predicate).forEach(updater); } ``` 6. 删除数据 为了删除数据表中的数据,我们可以提供一个 delete 方法来删除符合条件的数据。该方法需要接受一个 Predicate<List<Object>> 类型的参数,代表删除条件。在该方法中,我们可以使用 Java 8 的 Stream API 来筛选符合条件的数据,并进行删除操作。 代码如下: ```java public void delete(Predicate<List<Object>> predicate) { this.rows.removeIf(predicate); } ``` 7. 完整代码 完整的 DataTable 类代码如下: ```java import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; public class DataTable { private String tableName; private List<String> columnNames; private List<List<Object>> rows; public DataTable(String tableName, List<String> columnNames) { this.tableName = tableName; this.columnNames = columnNames; this.rows = new ArrayList<>(); } public void addRow(List<Object> rowData) { this.rows.add(rowData); } public List<List<Object>> getRows() { return this.rows; } public List<List<Object>> select(Predicate<List<Object>> predicate) { return this.rows.stream().filter(predicate).collect(Collectors.toList()); } public void update(Predicate<List<Object>> predicate, Consumer<List<Object>> updater) { this.rows.stream().filter(predicate).forEach(updater); } public void delete(Predicate<List<Object>> predicate) { this.rows.removeIf(predicate); } // 省略 get/set 方法 } ``` 这样,我们就成功地实现了一个简单的 DataTable 类。当然,这个类还有很多可以改进的地方,比如支持数据类型、索引等功能。不过,以上代码足以满足大部分的数据操作需求了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值