一.介紹
由於習慣了C#中Linq的強大功能,遺憾的是,在Java里沒有這樣強大的功能支持,於是嘗試在網上去尋找有無這樣的實現。結果還真發現有這么一套開源代碼,在Java上實現在C#上有的功能,可以說是用愛發電吧。
上該源碼的git地址 https://github.com/timandy/linq
Linq查詢的優勢是,在做條件篩選、排序等功能時可以用最少的代碼去完成。同時,比起stream api更有優勢,文檔上強調,在大多數復雜情況下,Linq比stream api更快。
這里的Linq使用只有方法鏈的使用,類似sql的表達也就C#的語法糖才有,在Java上不支持。
二.使用
maven安裝。
<dependency> <groupId>com.bestvike</groupId> <artifactId>linq</artifactId> <version>3.1.0</version> </dependency>
准備測試數據。
public class User { private Integer id; private String name; private Integer age; private Integer money; private Integer roleID; private Role role; //...public User(Integer id, String name, Integer age, Integer money, Integer roleID) { this.id = id; this.name = name; this.age = age; this.money = money; this.roleID = roleID; } } public class Role { private Integer id; private String name; //...
public Role(Integer id, String name) { this.id = id; this.name = name; } } List<User> list = new ArrayList<>(); list.add(new User(1, "張三", 15, 100, 1)); list.add(new User(2, "李四", 16, 200, 1)); list.add(new User(3, "王五", 17, 400, 2)); list.add(new User(4, "宋六", 17, 250, 2)); list.add(new User(5, "龍七", 17, 250, 2)); List<Role> roleList = new ArrayList<>(); roleList.add(new Role(1, "普通用戶")); roleList.add(new Role(2, "超級用戶"));
帶where查詢
//方法鏈 var ddd = Linq.of(list).where(x -> x.getAge() > 15).toList(); //sql String sql = "select * from user where age>15";
簡單的函數計算(max、min、count、sum)
//方法鏈 //var ddd = Linq.of(list).max(x -> x.getAge());//獲取最大的年齡 //var ddd = Linq.of(list).min(x -> x.getAge());//獲取最小的年齡 //var ddd = Linq.of(list).count();//獲取總數 var ddd = Linq.of(list).sumInt(x -> x.getAge());//獲取總數 //sql //String sql = "select max(age) from user"; //String sql = "select min(age) from user"; //String sql = "select count(1) from user"; String sql = "select sum(age) from user";
排序
//方法鏈 //var ddd = Linq.of(list).orderBy(x -> x.getAge());//正序 var ddd = Linq.of(list).orderByDescending(x -> x.getAge());//倒序 //sql //String sql = "select * from user order by age"; String sql = "select * from user order by age desc";
top1
//方法鏈 var ddd = Linq.of(list).firstOrDefault(); //sql String sql = "select top 1 from user";
跳過前面多少條數據,取剩下的數據
//方法鏈 var ddd = Linq.of(list).orderByDescending(x -> x.getAge()).skip(1); //sql String sql = "select * from (select ROW_NUMBER() over(order by age desc) as rowNum,*) t wher rowNum>1";
分頁查詢
//方法鏈 //跳過第一條,取兩條,即取第二條到第四條 var ddd = Linq.of(list).orderByDescending(x -> x.getAge()).skip(1).take(3); //sql String sql = "select * from (select ROW_NUMBER() over(order by age desc) as rowNum,*) t wher rowNum>1 and rowNum<=4";
包含,相當於like
//方法鏈 var ddd = Linq.of(list).where(x->x.getName().contains("李")); //sql String sql = "select * from user where name like '%李%'";
分組group by
//方法鏈 var ddd = Linq.of(list).groupBy(x -> x.getAge()).toList(); for (var t : ddd) { System.out.println(t.getKey() + "--" + t.minInt(x -> x.getMoney()) + "--" + t.maxInt(x -> x.getMoney()) + "--" + t.sumInt(x -> x.getMoney())); } //sql String sql = "select age,min(money),max(money),sum(money) from user group by age";
sql中的in
//方法鏈 List<Integer> ages = new ArrayList<>(); ages.add(15); ages.add(16); var ddd = Linq.of(list).where(x -> ages.contains(x.getAge())); //sql String sql = "select * from user where age in (15,16)";
三.總結
由於對這個插件不是太熟悉,個別api不太了解用法。不過,基本的查詢使用應該足夠了。