Java 8仍然需要LINQ吗? 还是比LINQ更好?

长期以来, LINQ是.NET软件工程生态系统中发生的最好的事情之一。 通过在Visual Studio 2008中引入lambda表达式和monads ,它使C#语言比Java(当时的版本6)更先进,并且仍在讨论泛型类型擦除的优缺点。 这项成就主要归功于荷兰计算机科学家兼染料专家Erik Meijer并获得其认可,他现在正从事其他项目 。

Erik Meijer,Tye染料专家。图片由Ade Oshineye提供。根据CC-BY-SA许可

Erik Meijer,Tye染料专家。 Ade Oshineye摄 。 根据CC-BY-SA许可

Java现在在哪里?

随着即将发布的Java 8和JSR-355 ,我们仍然需要LINQ吗? 自上个十年中期以来,已经进行了许多尝试来将LINQ的优点带给Java。 当时, Quaere和Lambdaj似乎是在图书馆级别(而不是语言级别)上有希望的实现。 实际上, 大量流行的Stack Overflow问题暗示了实际上有多少Java人员正在(并且仍然是!)寻找等同的东西:

  • LINQ的Java等效项是什么?
  • LINQ for Java工具
  • 是否有类似LINQ for Java的东西?
  • Linq和Entity Framework的Java等效项是什么?

有趣的是,“ LINQ”甚至已经成为EL 3.0 !

但是我们真的需要LINQ吗?

LINQ有一个主要缺陷,该缺陷被宣传为一项功能,但在我们看来,这将不可避免地导致“下一个大阻抗失配” 。 LINQ受SQL启发,这根本不是一件好事。 LINQ最流行于LINQ-to-Objects ,这是查询.NET中集合的一种好方法。 但是, Haskell或Scala的成功表明,“集合查询”的真正功能本质倾向于使用除SELECTWHEREGROUP BYHAVING之外的其他术语。 他们使用的术语包括“折叠”,“地图”,“ flatMap”,“减少”等等。 另一方面,LINQ使用GROUP BY和“ skip”,“ take”(而不是OFFSETFETCH )等术语的混合体。

实际上,除了良好的旧SQL 分区外部联接, 分组集或框架窗口函数之外,没有什么比功能真理更重要的了。 这些构造仅仅是SQL开发人员希望看到的结果的声明。 它们不是独立的函数,实际上包含要在任何给定上下文中执行的逻辑。 而且,窗口函数只能在SELECTORDER BY子句中使用, 这在以声明方式进行思考时很明显 ,但是如果您没有SQL上下文,这也很奇怪。 具体来说, SELECT子句中的窗口函数会影响整个执行计划,以及采用索引来预取正确数据的方式。

相反,真正的函数式编程对内存中集合的作用比SQL还要多。 使用SQLesque API进行集合查询是一个狡猾的决定 ,目的是欺骗“传统”人员采用函数式编程。 但是,使集合和SQL表查询可以混淆的希望令人失望,因为这样的构造不会产生所需的SQL执行计划 。

相反,真正的函数式编程对内存中集合的作用比SQL还要多。 使用SQLesque API进行集合查询只是错误的决定。 令人失望的是,收集和SQL表查询可能会混淆在一起,因为这样的构造将不可避免地产生可怕的SQL执行计划 。

但是,如果我

这很简单。 执行SQL时,有两个基本选择。

  • “自上而下”进行操作,将大部分精力放在Java域模型上。 在这种情况下,请使用Hibernate / JPA通过Java 8 Streams API查询和转换Hibernate结果。
  • “自下而上”进行操作,将大部分精力放在您的SQL /关系域模型上。 在这种情况下,请使用JDBC或jOOQ,然后再次使用Java 8 Streams API转换结果。

此处对此进行了更详细的说明: http : //www.hibernate-alternative.com

拥抱未来!

虽然.NET在Java领域已经“领先”一段时间了,但这并不是由于LINQ本身引起的。 这主要是由于引入了lambda表达式以及lambda对* ALL * API的影响。 LINQ只是如何构造此类API的一个示例,尽管LINQ赢得了大多数赞誉。

但是,我对Java 8的新Streams API以及它将如何包含Java生态系统中的某些功能编程感到更加兴奋。 Informatech在一篇非常好的博客文章中说明了常见的LINQ表达式如何转换为Java 8 Streams API表达式。

所以,不要回头。 停止羡慕.NET开发人员。 使用Java 8,我们将不需要LINQ或任何试图以“统一查询”为基础来模仿LINQ的API,这对于真正的“查询目标阻抗不匹配”来说是一个更好的称呼。 我们需要真正的SQL来进行关系数据库查询,并且需要Java 8 Streams API来进行内存中集合的功能转换。 而已。 使用Java 8!

参考: Java 8是否仍需要LINQ? 还是比LINQ更好? 从我们的JCG合作伙伴 Lukas Eder在JAVA,SQL和JOOQ博客中获得。

翻译自: https://www.javacodegeeks.com/2013/11/does-java-8-still-need-linq-or-is-it-better-than-linq.html

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

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

相关文章

web前端(12)—— 页面布局2

本篇博文,主要就讲定位的问题,也就是页面布局里最重要的,本篇博文不出意外的话,也是css的最后一篇博文了 定位,position属性 定位有三种: 相对定位绝对定位固定定位 相对定位,position&#x…

python pyplot中axis_Python Pyplot xaxis未显示在图形上

pyplot未在图形上显示x轴:import pandas as pdimport matplotlib.pyplot as pltdf pd.read_csv(sitka_weather_2014.csv)df[AKST] pd.to_datetime(df.AKST)df[Dates] df[AKST].dt.strftime(%b %d, %Y)df.set_index("Dates", inplace True)# Plot Dataf…

web前端入门学习(纯干货)

web前端怎么样才能入门,首先我们要从什么是初级web前端工程师说起: 按照我的想法,我把前端工程师分为了入门、初级、中级、高级这四个级别, 入门级别指的是了解什么是前端(前端到底是什么其实很多人还是不清楚的&…

[校内模拟题2]

水题 但是原地螺旋炸裂 都不好意思贴代码了QWQ enc 【问题背景】 zhx 和他的妹子聊天。 【问题描述】 考虑一种简单的加密算法。假定所有句子都由小写英文字母构成, 对于每一个字母, 我们将它唯一地映射到另一个字母。 例如考虑映射规则:a-&g…

AJAX初识(原生JS版AJAX和Jquery版AJAX)

一、什么是JSON 1.介绍JSON独立于语言,是一种与语言无关的数据格式。JSON指的是JavaScript对象表示法(JavaScript Object Notation)JSON是轻量级的文本数据交换格式JSON具有自我描述性,更易理解JSON使用JavaScript语法来描述数据对…

内存不足而没有OutOfMemoryError

这实际上是最初发布于2010年的帖子的转世。 昨天,当听到我们的工程师咒骂一个特别令人讨厌的错误时,闪回发生了。 当诅咒停止时,我走过去核实我的怀疑。 瞧,我是正确的–情绪波动是由应用程序用尽了堆空间导致的,但死于…

人工智能第二星期总结-------纵里寻它千百度

2018-07-28 第二周: 此时此刻我怀着无比沉重的心情在这里做一周的学习检讨工作 这星期依此就开始讲到了函数,话说函数可是python里面的钟头戏,不仅可以节约代码,还可以把代码重复使用,只要后面轻轻松松就可以搞定啦&am…

个人作业——软件产品案例分析

个人作业——软件产品案例分析 第一部分 调研,评测 评测: 第一次上手体验 第一眼看上去功能很全面,但是到点开来发现功能大部分没有实现,体验不太好。 缺陷Bug情况 课表查询 bug描述:课表查询没有课表结果,点进去当前周…

Linux CentOS 6.5 使用自带jdk修改环境变量

来源:https://www.cnblogs.com/zhenxiqia/p/9049290.html Linux CentOS 6.5 使用自带jdk修改环境变量 首先声明,默认jdk指我们安装完CentOS后系统自带jdk,自己下载安装的jdk只需要下载,解压即可,之后步骤与此文一致 1.查看我们默认…

微信小程序下拉框

微信小程序组件里没有下拉框&#xff0c;正好要用到&#xff0c;记下来以后参考 wxml代码 <view classtop><view classtop-text> 选择接收班级</view><!-- 下拉框 --><view classtop-selected bindtapbindShowMsg><text>{{grade_name}}&l…

CSS 高度(css height)

DIV CSS height高度知识教程篇 DIV CSS高度简介这里的CSS高度是指通过CSS来控制设置对象的高度。使用CSS属性单词height。单位可以使用PX&#xff0c;em等常用使用PX&#xff08;像素&#xff09;为html单位。 height高度目录height高度语法高度用法html原始高度设置css高度hei…

第三代酷睿i3处理器_轻薄本CPU谁更强?英特尔21款低功耗处理器大排行!

点击上电脑爱好者关注我们对智能手机而言&#xff0c;其搭载的SoC是衡量性能强弱的唯一准绳&#xff0c;因为一颗SoC芯片内就集成了CPU(处理器)、GPU(显卡&#xff0c;包括集成的核显和独显)、ISP(影像处理器)和Modem(调制解调器)等模块&#xff0c;只要掌握了SoC的强弱关系&am…

python学习日记(匿名函数)

匿名函数 简介 匿名函数&#xff1a;为了解决那些功能很简单的需求而设计的一句话函数。 python 使用 lambda 来创建匿名函数。 所谓匿名&#xff0c;意即不再使用 def 语句这样标准的形式定义一个函数。 1 lambda 只是一个表达式&#xff0c;函数体比 def 简单很多。 2 lambda…

列表相关元素及其属性

HTML5保留了如下几个列表相关元素&#xff1a;无序列表<ul>、有序列表<ol>、自定义列表<dl> 1、<ul>&#xff1a;定义无序列表&#xff0c;可以指定id、style、class等属性&#xff0c;还可以指定onclick等事件属性。 2、<ol>&#xff1a;定义有…

DB 数据同步到数据仓库的架构与实践

背景 在数据仓库建模中&#xff0c;未经任何加工处理的原始业务层数据&#xff0c;我们称之为ODS&#xff08;Operational Data Store&#xff09;数据。在互联网企业中&#xff0c;常见的ODS数据有业务日志数据&#xff08;Log&#xff09;和业务DB数据&#xff08;DB&#xf…

java log.error_Logger.error打印错误异常的详细堆栈信息

一、问题场景使用Logger.error方法时只能打印出异常类型&#xff0c;无法打印出详细的堆栈信息&#xff0c;使得定位问题变得困难和不方便。二、先放出结论Logger类下有多个不同的error方法&#xff0c;根据传入参数的个数及类型的不同&#xff0c;自动选择不同的重载方法。当e…

笔记本电脑怎么清理灰尘_手机声音越用越小怎么办?一段黑科技音波就能清理扬声器灰尘...

大家好&#xff0c;欢迎收看科技狐&#xff0c;我是小狐。我们都知道&#xff0c;随着手机的使用时间越来越长&#xff0c;手机扬声器里面会积赞一些灰尘。因此手机的声音就会变得越来越小。有时候连电话铃声都听不清楚&#xff0c;说实话我就是这个样子&#xff0c;为此我困扰…

Java方法中的参数太多,第8部分:工具

在我的系列文章的前七篇文章中&#xff0c;有关处理Java方法中期望的参数过多的内容集中在减少方法或构造函数期望的参数数量的替代方法上。 在本系列的第八篇文章中&#xff0c;我将介绍一些工具&#xff0c;这些工具可帮助您确定可能存在过多参数的情况&#xff0c;并在出现这…

predict函数 R_学习|R语言做机器学习的常用函数总结

预测函数&#xff1a;predict() type"prob"判别该量度的昆虫归类为A、B和C的概率&#xff1b;type"response"&#xff1a;判别该量度的昆虫的类别&#xff1b;预测分类的概率的函数predict(…, type)参数type&#xff1a;R语音里面不同模型&#xff0c;参数…

微信小程序:动画(Animation)

简单总结一下微信动画的实现及执行步骤。 一、实现方式 官方文档是这样说的&#xff1a;①创建一个动画实例 animation。②调用实例的方法来描述动画。③最后通过动画实例的 export 方法导出动画数据传递给组件的 animation 属性。 因为小程序是数据驱动的&#xff0c;给这句话…