做外貿(mào)電商網(wǎng)站有哪個(gè)b站推廣網(wǎng)站
Lin4j簡(jiǎn)介
Linq4j是Apache Calcite項(xiàng)目中的一個(gè)模塊,它提供了類似于LINQ(Language-Integrated Query)的功能,用于在Java中進(jìn)行數(shù)據(jù)查詢和操作。Linq4j可以將邏輯查詢轉(zhuǎn)換為物理查詢,支持對(duì)集合進(jìn)行篩選、映射、分組等操作。
例如,通過(guò)Linq4j可以將類似于以下的邏輯查詢語(yǔ)句轉(zhuǎn)換為最終的在java集合上的查詢操作:
Enumerable<Employee> employees = ...;
Enumerable<String> names = employees.where(emp -> emp.getSalary() > 50000).select(emp -> emp.getName());
依賴
<dependency><groupId>org.apache.calcite</groupId><artifactId>calcite-linq4j</artifactId><version>1.36.0</version>
</dependency>
Linq4j核心類與接口
- Linq4j:org.apache.calcite.linq4j.Linq4j,一個(gè)實(shí)用工具類,可將 java.util.Collection、java.lang.Iterable、java.util.List等集合對(duì)象轉(zhuǎn)換為 org.apache.calcite.linq4j.Enumerable
- Enumerable:接口的職責(zé)是定義了對(duì)集合進(jìn)行查詢和操作的方法,包括篩選、映射、分組等功能。接口繼承了下列三個(gè)接口,支持集合的迭代、投影、過(guò)濾等操作
- RawEnumerable (org.apache.calcite.linq4j):返回org.apache.calcite.linq4j.Enumerator,可對(duì)Enumerator實(shí)現(xiàn)進(jìn)行迭代
- Iterable (java.lang):返回java.lang.Iterable,可對(duì)Iterable的實(shí)現(xiàn)迭代
- ExtendedEnumerable (org.apache.calcite.linq4j):定義了在集合對(duì)象上的操作 例如 select 投影、where 過(guò)濾、groupBy 分組 、hashJoin 連接
因此通過(guò)Linq4j轉(zhuǎn)換方法將輸入集合轉(zhuǎn)換為Enumerable,這樣就可在原始數(shù)據(jù)上進(jìn)行操作。
使用案例
使用過(guò)濾、投影、分組
- 投影沒(méi)有進(jìn)行映射變換,按原值輸出
- 過(guò)濾篩選出大于3的數(shù)
- 最后進(jìn)行分組,分組后返回的是一個(gè) Grouping 對(duì)象,使用sum函數(shù)對(duì)分組求和,最終輸出求和后的結(jié)果
整個(gè)操作使用分組后返回的是Grouping對(duì)象,因此后續(xù)操作基于此對(duì)象進(jìn)行
List<Integer> idList = Lists.newArrayList(1,2,3,4,5,6);Enumerable<Integer> itEnumerable = Linq4j.asEnumerable(idList);Enumerable<Grouping<Boolean, Integer>> result =itEnumerable.select((a) -> a).where((a) -> a > 3).groupBy(a -> a%2 == 0);for (Grouping<Boolean, Integer> item: result) {int sum = item.sum(new IntegerFunction1<Integer>() {@Overridepublic int apply(Integer v0) {return v0;}});System.out.println(item.getKey() + " : " + sum);}
通過(guò)一個(gè)案例,可類推其它方法的使用。
Linq4j在Calcite中的應(yīng)用
在使用Calcite實(shí)現(xiàn)適配多來(lái)源數(shù)據(jù)查詢時(shí),需要實(shí)現(xiàn)自定義的table,通常需要借助Linq4j提供的方法將集合轉(zhuǎn)換為Enumerable實(shí)例,轉(zhuǎn)換過(guò)程中依賴asEnumerable方法創(chuàng)建Enumerable實(shí)例實(shí)例,接著通過(guò)select進(jìn)行對(duì)象類型轉(zhuǎn)換。
public class TableForList extends AbstractTable implements ScannableTable{private PersonList personList;public TableForList(PersonList personList) {this.personList = personList;}@Overridepublic Enumerable<Object[]> scan(DataContext root) {return Linq4j.asEnumerable(personList.getPersonList()).select(emp -> new Object[]{emp.getId(), emp.getName(), emp.getAge()});}