做外貿電商網(wǎng)站有哪個b站推廣網(wǎng)站
Lin4j簡介
Linq4j是Apache Calcite項目中的一個模塊,它提供了類似于LINQ(Language-Integrated Query)的功能,用于在Java中進行數(shù)據(jù)查詢和操作。Linq4j可以將邏輯查詢轉換為物理查詢,支持對集合進行篩選、映射、分組等操作。
例如,通過Linq4j可以將類似于以下的邏輯查詢語句轉換為最終的在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,一個實用工具類,可將 java.util.Collection、java.lang.Iterable、java.util.List等集合對象轉換為 org.apache.calcite.linq4j.Enumerable
- Enumerable:接口的職責是定義了對集合進行查詢和操作的方法,包括篩選、映射、分組等功能。接口繼承了下列三個接口,支持集合的迭代、投影、過濾等操作
- RawEnumerable (org.apache.calcite.linq4j):返回org.apache.calcite.linq4j.Enumerator,可對Enumerator實現(xiàn)進行迭代
- Iterable (java.lang):返回java.lang.Iterable,可對Iterable的實現(xiàn)迭代
- ExtendedEnumerable (org.apache.calcite.linq4j):定義了在集合對象上的操作 例如 select 投影、where 過濾、groupBy 分組 、hashJoin 連接
因此通過Linq4j轉換方法將輸入集合轉換為Enumerable,這樣就可在原始數(shù)據(jù)上進行操作。
使用案例
使用過濾、投影、分組
- 投影沒有進行映射變換,按原值輸出
- 過濾篩選出大于3的數(shù)
- 最后進行分組,分組后返回的是一個 Grouping 對象,使用sum函數(shù)對分組求和,最終輸出求和后的結果
整個操作使用分組后返回的是Grouping對象,因此后續(xù)操作基于此對象進行
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);}
通過一個案例,可類推其它方法的使用。
Linq4j在Calcite中的應用
在使用Calcite實現(xiàn)適配多來源數(shù)據(jù)查詢時,需要實現(xiàn)自定義的table,通常需要借助Linq4j提供的方法將集合轉換為Enumerable實例,轉換過程中依賴asEnumerable方法創(chuàng)建Enumerable實例實例,接著通過select進行對象類型轉換。
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()});}