Java中使用C#的Linq


一.介紹  

  由於習慣了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不太了解用法。不過,基本的查詢使用應該足夠了。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM