Java进阶-JINQ详解与使用

news2024/12/24 8:35:53

本文详细介绍了JINQ(Java Integrated Query),一种强化Java中数据查询能力的库,提供类SQL的查询语法和类型安全的操作。文章首先解释了JINQ的基本功能和应用,随后通过具体示例展示了如何使用JINQ进行数据过滤、投影、连接、分组等操作。接着,与Java Stream API、Google Guava等其他热门集合处理包进行了比较,突出了JINQ在类型安全和查询直观性方面的优势。最后,总结了JINQ的使用价值,特别是对于需要进行复杂数据处理的Java开发者。
在这里插入图片描述


一、JINQ介绍

1. JINQ简述

JINQ(Java Integrated Query)是一个为Java设计的库,类似于C#的LINQ,它提供了一个强大的查询接口,允许开发者以声明式方式处理Java集合和数据库查询。JINQ利用Java 8的lambda表达式和Stream API,使得数据库和集合的查询更加直观和类型安全。

2. JINQ支持的功能

功能描述
查询转换允许对数据库或集合进行转换查询,如映射、筛选等
聚合操作支持对数据进行聚合操作,如计数、求和、平均值等
类型安全的查询通过API保证查询的类型安全,减少运行时错误
集成数据库查询可以直接在数据库上执行类似LINQ的查询,而不仅限于内存中的集合
延迟执行查询操作是延迟执行的,只有在需要结果时才进行计算

3. JINQ的使用优势

特性 / 工具JINQJava Stream APISQL
查询能力针对数据库和Java集合仅限Java集合仅限数据库
类型安全否(依赖字符串查询)
延迟执行通常不是(即时查询)
聚合操作强大,支持多种数据库操作有限,主要是内存中处理强大,直接在数据库执行
使用难度中等,需要理解查询表达式较低,易于上手高,需要SQL知识

二、常用的JINQ功能

1. Where 过滤

通过where方法,可以实现对数据集的条件过滤,仅返回满足条件的元素集合。

List<Product> allProducts = Arrays.asList(new Product("TV", "Electronics"), new Product("Blender", "Kitchen"));
List<Product> electronics = jinqStream.where(p -> p.getCategory().equals("Electronics")).toList();
System.out.println(electronics); // 输出: [Product{name='TV', category='Electronics'}]

2. Select 投影

使用select方法可以选择数据流中的特定字段,类似于SQL中的SELECT子句。

List<String> productNames = jinqStream.select(Product::getName).toList();
System.out.println(productNames); // 输出: ["TV", "Blender"]

3. Join 连接

join方法允许对两个相关的数据集进行关联,实现内连接或外连接。

List<Product> products = Arrays.asList(new Product("TV", 1), new Product("Blender", 2));
List<Supplier> suppliers = Arrays.asList(new Supplier(1, "Sony"), new Supplier(2, "Samsung"));
List<Pair<Product, Supplier>> productsWithSuppliers = jinqStream.join(Product::getSupplierId, Supplier::getId)
                                                                .select(pair -> new Pair<>(pair.getOne(), pair.getTwo()))
                                                                .toList();
System.out.println(productsWithSuppliers); // 输出: [Pair{one=Product{name='TV', supplierId=1}, two=Supplier{id=1, name='Sony'}}, Pair{one=Product{name='Blender', supplierId=2}, two=Supplier{id=2, name='Samsung'}}]

4. GroupBy 分组

groupBy方法允许将数据按照指定的属性分组,类似于SQL中的GROUP BY子句。

List<Product> products = Arrays.asList(new Product("TV", "Electronics"), new Product("Blender", "Kitchen"), new Product("Microwave", "Kitchen"));
Map<String, List<Product>> productsByCategory = jinqStream.groupBy(Product::getCategory).toList();
System.out.println(productsByCategory); // 输出: {'Electronics': [Product{name='TV', category='Electronics'}], 'Kitchen': [Product{name='Blender', category='Kitchen'}, Product{name='Microwave', category='Kitchen'}]}

5. OrderBy排序

orderBy方法允许对结果集进行排序,支持升序或降序。

List<Product> products = Arrays.asList(new Product("TV", 500), new Product("Blender", 150), new Product("Microwave", 200));
List<Product> sortedProducts = jinqStream.orderBy(Comparator.comparing(Product::getPrice)).toList();
System.out.println(sortedProducts); // 输出: [Product{name='Blender', price=150}, Product{name='Microwave', price=200}, Product{name='TV', price=500}]

6. Aggregate聚合

aggregate方法用于执行各种聚合操作,如求和、求平均、最大值和最小值等。

List<Product> products = Arrays.asList(new Product("TV", 500), new Product("Blender", 150), new Product("Microwave", 200));
BigDecimal totalRevenue = jinqStream.aggregate(sum(Product::getPrice), BigDecimal.ZERO);
System.out.println(totalRevenue); // 输出: 850 (假设价格单位为元)

7. Count计数

使用count方法可以快速计算满足特定条件的元素数量。

List<Product> products = Arrays.asList(new Product("TV", 500), new Product("Blender", 150), new Product("Microwave", 200));
long expensiveProductsCount = jinqStream.where(p -> p.getPrice() > 300).count();
System.out.println(expensiveProductsCount); // 输出: 1

8. Distinct去重

distinct方法用于去除重复元素,确保结果集中的每个元素都是唯一的。

List<String> categories = Arrays.asList("Electronics", "Kitchen", "Electronics", "Kitchen");
List<String> uniqueCategories = jinqStream.distinct().toList();
System.out.println(uniqueCategories); // 输出: ["Electronics", "Kitchen"]

9. Limit限制

使用limit方法可以限制结果集的大小,类似于SQL中的LIMIT子句。

List<Product> products = Arrays.asList(new Product("TV", 500), new Product("Blender", 150), new Product("Microwave", 200));
List<Product> limitedProducts = jinqStream.limit(2).toList();
System.out.println(limitedProducts); // 输出: [Product{name='TV', price=500}, Product{name='Blender', price=150}]

10. Skip跳过

skip方法允许跳过结果集中的前N个元素,继续处理之后的元素。

List<Product> products = Arrays.asList(new Product("TV", 500), new Product("Blender", 150), new Product("Microwave", 200));
List<Product> remainingProducts = jinqStream.skip(1).toList();
System.out.println(remainingProducts); // 输出: [Product{name='Blender', price=150}, Product{name='Microwave', price=200}]

三、JINQ和类似包的比较

1. 常见的Java集合处理库

在Java中处理集合和数据流时,除了JINQ,还有多种流行的库提供了丰富的功能。
比如下面这些常用的Java集合处理包:

  • Java Stream API - Java 8及以上版本内置的功能,支持丰富的流操作。
  • Google Guava - 提供了多种强大的集合工具和扩展。
  • Apache Commons Collections - 提供了大量扩展集合操作的工具。
  • Eclipse Collections - 专注于性能和内存优化的丰富集合库。
  • Vavr(之前称为Javaslang)- 提供不可变集合和函数式编程工具,增强了Java的函数式编程能力。

2. 集合处理库之间的比较

每个包都有各自的特点和用途:

特性 / 库JINQJava Stream APIGoogle GuavaApache Commons CollectionsEclipse CollectionsVavr
主要优势类SQL查询语法,类型安全内置支持,流式处理丰富的集合工具和实用程序扩展旧Java版本的集合操作性能和内存优化不可变集合,函数式编程
数据处理模式同步同步或异步(并行流)同步同步同步或异步(并行集合)同步
类型安全
不可变集合全部不可变
函数式编程支持
专注领域数据库和集合查询集合流操作集合扩展和实用工具集合操作扩展集合性能优化集合和函数式编程
与Java版本兼容性Java 8+Java 8+Java 6+Java 1.2+Java 5+Java 8+

不同的库各有侧重点,例如Java Stream API适合进行复杂的流式数据处理,Google Guava提供了丰富的集合处理工具,Eclipse Collections关注于性能优化,而Vavr增强了Java的函数式编程能力。选择哪个工具库,取决于具体项目的需求和开发团队的熟悉度。


四、JINQ使用总结

JINQ为Java开发者提供了一个强大的工具,以声明式和类型安全的方式处理数据查询。它填补了Java Stream API在数据库查询方面的空白,并提供了一个高效的方式来处理集合和数据库中的数据。虽然它的学习曲线可能略高于直接使用Stream API,但它在数据查询和处理的能力上提供了显著的优势,特别是在需要与数据库交互的应用中。通过使用JINQ,开发者可以更加专注于业务逻辑,而不是数据访问代码的细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python自学篇3-PyCharm开发工具下载、安装及应用

一、Python开发工具 自学篇1中讲到了安装Python之后出现的几个应用程序&#xff0c;其中IDLE、Python.exe都可以用来编写python程序&#xff0c;也可以进行调试&#xff1b;但是比较基础&#xff0c;比较原始&#xff0c;调试不方便&#xff0c;界面也不友好&#xff0c;需要更…

天空卫士旗舰产品入选《网络安全专用产品指南》

权威认证 近日&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;发布了第一版《网络安全专用产品指南》。这一权威指南中&#xff0c;天空卫士荣获殊荣&#xff0c;旗下三款尖端产品荣耀入选&#xff0c;分别是增强型Web安全网关&#xff08;ASWG&#xff09;、数…

解析Redis Key Prefix配置之谜:双冒号“::”的由来与作用

前言 在使用Spring Boot集成Redis进行应用开发时&#xff0c;为了增强缓存键的可读性和管理性&#xff0c;我们常常会在配置文件中设定一个全局的key-prefix。如果你发现存储至Redis的键自动附加了“::”&#xff0c;本文将深入探讨这一现象背后的原因&#xff0c;解析Spring …

长难句打卡4.29

If appropriate public policies were in place to help all women—whether CEOs or their children’s caregivers—and all families, Sandberg would be no more newsworthy than any other highly capable person living in a more just society 如果能制定适当的公共政策…

解决Pycharm全局搜索与输入法简繁切换快捷键冲突问题

Pycharm中全局搜索快捷键Ctrl Shift F 如图所示&#xff1a; 微软输入法简繁切换快捷键设置&#xff1a; 解决办法&#xff1a; 关掉输入法的切换功能即可&#xff0c;或者更改简繁切换快捷键&#xff0c;毕竟简繁切换使用频率极低。

智慧农业设备——虫情监测系统

随着科技的不断进步和农业生产的日益现代化&#xff0c;智慧农业成为了新时代农业发展的重要方向。其中&#xff0c;虫情监测系统作为智慧农业的重要组成部分&#xff0c;正逐渐受到广大农户和农业专家的关注。 虫情监测系统是一种基于现代传感技术、图像识别技术和大数据分析技…

Django-admin组件

Django-admin组件 admin是django中提供的一套可视化工具&#xff1a;用于对ORM中定义的表进行增删改查。 1 概览 在django项目启动时&#xff0c;自动找到注册到admin中的所有model中定义的类&#xff0c;然后为这些类生成一系列的URL和视图函数&#xff0c;实现基本增删改查…

202009青少年软件编程(Python)等级考试试卷(一级)

第 1 题 【单选题】 Python自带的编程环境是&#xff1f;&#xff08; &#xff09; A :PyScripter B :Spyder C :Notepad D :IDLE 正确答案:D 试题解析: 第 2 题 【单选题】 假设a2,b3,那么a-b*b的值是&#xff1f;( ) A :-3 B :-2 C :-7 D :-11 正确答案:C 试题…

基于ESP32—CAM物联网WIFI小车

一.功能概述 摄像头的画面可以实时的传输到&#xff0c;点灯科技APP的手机端&#xff0c;这样可以实时查看周围环境的状况&#xff0c;灯光不足&#xff0c;画面不清晰时可以打开灯光照明。手机端有左转、右转、前进、后退、停止的按钮。可以根据自己需要&#xff0c;来控制小车…

变革 Perplexica:AI驱动的问答搜索引擎

Perplexica是一个开源的人工智能搜索工具&#xff0c;也可以说是一款人工智能搜索引擎&#xff0c;它深入互联网以找到答案。受Perplexity AI启发&#xff0c;它是一个开源选择&#xff0c;不仅可以搜索网络&#xff0c;还能理解您的问题。它使用先进的机器学习算法&#xff0c…

【doghead】修改abseil-cpp 构造worker成功

台式机 13900k 的wsl2 ubuntu22.04 环境root@DESKTOP-1723CM1:/mnt/d/XTRANS/thunderbolt/ayame/zhb-bifrost/Bifrost-202403/worker/build# uname -a Linux DESKTOP-1723CM1 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GN…

电商技术揭秘四十:电商智能风控系统决策引擎浅析

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

Grafana页面嵌入自建Web应用页面

目录 一、应用场景 二、实现方式 1、修改Grafana配置文件 2、获取监控页面url 3、隐藏左侧和顶部菜单 一、应用场景 需要将Grafana监控页面嵌入自建Web应用页面&#xff0c;使Grafana监控页面成为自建Web应用的一部分。 二、实现方式 总体思路&#xff1a;修改Grafana配…

嵌入式移植7Z解压缩(纯C)

本文分享一个纯C语言编写的7Z解压缩代码库&#xff0c;本代码库的主要目的是在嵌入式环境下使用7z解压缩文件&#xff0c;可以将升级包通过7z进行压缩&#xff0c;然后发送给设备&#xff0c;减小和设备传输过程中的文件大小&#xff0c;进而达到传输大文件的目的。 下载链接 …

[CUDA 学习笔记] GEMM 优化: 双缓冲 (Prefetch) 和 Bank Conflict 解决

GEMM 优化: 双缓冲 (Prefetch) 和 Bank Conflict 解决 前言 本文主要是对 深入浅出GPU优化系列&#xff1a;GEMM优化&#xff08;一&#xff09; - 知乎, 深入浅出GPU优化系列&#xff1a;GEMM优化&#xff08;二&#xff09; - 知乎 以及 深入浅出GPU优化系列&#xff1a;GE…

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些&#xff0c;然后再动手操作 用Python写了一个简单数组类&#xff0c;首先思考下都写哪些功能&#xff1a; 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

React + 项目(从基础到实战) -- 第十期

目标 学会react 状态管理工具 使用redux管理用户状态 Context 跨层级传递,不像props层层传递类似于Vue的provide/inject用于:切换主题颜色,切换语言 useReducer useState 的替代方案 简化版的redux MobX 1. MobX 介绍 MobX 中文文档 声明式的修改数据 , 像vue state ac…

数据结构-AVL树

目录 什么是 AVL 树 ASL 度量查找效率 结构体定义 平衡调整 调整类型 左旋和右旋 右旋 左旋 左、右平衡调整 左平衡调整 右平衡调整 插入数据 模拟建立 AVL 树 什么是 AVL 树 二叉排序树的形状取决于数据集&#xff0c;当二叉树的高度越小、结构越合理&#xff0c…

利用GaussDB的可观测性能力构建故障模型

D-SMART高斯专版已经开发了几个月了&#xff0c;目前主要技术问题都已经解决&#xff0c;也能够初步看到大概的面貌了。有朋友问我&#xff0c;GaussDB不已经有了TPOPS了&#xff0c;为什么你们还要开发D-SMART高斯专版呢&#xff1f; 实际上TPOPS和D-SMART虽然都可以用于Gaus…

Qt客服端开发的组件库

Qt 是一个功能丰富的跨平台 C 应用程序框架&#xff0c;它包含了许多用于不同目的的组件库。以下是一些主要的 Qt 组件库&#xff0c;这些库为开发者提供了广泛的工具和功能&#xff0c;以便构建复杂的应用程序。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&a…