




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LINQ for Java Integrating Query, Sets and Transform operations in J2EE Olmo del Corral LINQ for Java nThe LINQ Project is a set of extensions to the .NET Framework for language-integrated query, set, and transform operations. nExtends C# width native language syntax and class libraries for queries. nWe will show a way to do it in Java without making any change in the Java language. Query Example nThis is the way a C# 3 Query look like. nIt sorts, group and proyect the already defined collection: IEnumerable people; nSeems a SQL Query, but is just syntax sugar. nSo you can do the same without using it var query2 = from p in people where p.Age 20 orderby p.Age descending, p.Name group new p.Name, Senior = p.Age 30, FirstJob = p.Jobs0 by p.CanCode; Without Query Expressions nWithout the cosmetics, it starts feeling standard Java code. nIn the 5th line, Name = is omitted. nThe compiler do it for you. nBut it makes confusing. It is worth? var query2 = people.Where(p = p.Age 20) .OrderByDescending(p = p.Age).ThenBy(p = p.Name) .GroupBy(p = p.CanCode, p = new p.Name, Senior = p.Age 30, FirstJob = p.Jobs0 ); Without Anonymous Fields in Object Inicializators nA step further in code normalization. nBut, what new means? nIts a Anonymous Type. Just like a Java Anonymous Class but only with Fields, Properties nThe correct way of doing its by building your own class. var query2 = people.Where(p = p.Age 20) .OrderByDescending(p = p.Age).ThenBy(p = p.Name) .GroupBy(p = p.CanCode, p = new Name = p.Name, Senior = p.Age 30, FirstJob = p.Jobs0 ); Without Anonymous Types nNow we have PersonResume class with a well-known syntax! nAgain, what kind of constructor have braces instead of () ? nIts a Object Inizializator, this expression calls the default constructor and then iterates setting every involver property. nIn Java we should create a specific constructor: class PersonResume string _name; bool _senior; Job _firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; var query2 = people.Where(p = p.Age 20) .OrderByDescending(p = p.Age).ThenBy(p = p.Name) .GroupBy(p = p.CanCode, p = new PersonResume Name = p.Name, Senior = p.Age 30, FirstJob = p.Jobs0 ); Without Objects Inicializators nPersonResume class has a constructor with every field. Much more Java-like! nYou said people is a IEnumerable, so Are Where, OrderBy, GroupBy methods of IEnumerable? nNot really. Those Are Extensional Methods, act as it those where in IEnumerable, but in fact they are out. Confusing, right? nSun people prefer simplicity. A static method is a better approach. class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; var query2 = people.Where(p = p.Age 20) .OrderByDescending(p = p.Age).ThenBy(p = p.Name) .GroupBy(p = p.CanCode, p = new PersonResume(p.Name, p.Age 30, p.Jobs0) ); Without Extensional Methods nSelect, OrderBy, GroupBy should be static methods in Java. nRight! The only missing thing is the = operator. Some kind of pointer? nNo, its the syntax for Lambda Expressions. A very sort definition for methods. nThese have an expression body, but a function should have the return statement to be clear!. class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; var qwhere = Linq.Where(people,p = p.Age 20); var qorderage = Linq.OrderByDescending(qwhere,p = p.Age); var qthenbt = Linq.ThenBy(qorderage, p = p.Name); var groupy = Linq.GroupBy(qthenbt,p = p.CanCode, p = new PersonResume(p.Name, p.Age 30, p.Jobs0) ); With Explicit Typed Lambda Expressions nNow, were certain of the parameters type in lambda expression? nBut the = operator stills there!. This is so obscure!. nIf a function return a value, why there is no return statement? nWell maybe using return lambda expressions we will address this problem. class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; var qwhere = Linq.Where(people,(Person p)= p.Age 20); var qorderage = Linq.OrderByDescending(qwhere,(Person p) = p.Age); var qthenbt = Linq.ThenBy(qorderage, (Person p) = p.Name); var groupy = Linq.GroupBy(qthenbt,(Person p) = p.CanCode, (Person p) = new PersonResume(p.Name, p.Age 30, p.Jobs0) ); With Explicit Body Lambda Expressions nLambda expressions look simpler with this syntax! nSo, What really these lambda expressions are?. nJust a Anonymous Method! nWhy use another syntax if C# 2.0 has one for it? class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; var qwhere = Linq.Where(people,(Person p)= return p.Age 20;); var qorderage = Linq.OrderByDescending(qwhere, (Person p, Person q) = return p.Age.CompareTo(q.Age);); var qthenbt = Linq.ThenBy(qorderage, (Person p, Person q) = return p.Name.CompareTo(q.Name);); var groupy = Linq.GroupBy(qthenbt,(Person p) = return p.CanCode;, (Person p) = return new PersonResume(p.Name, p.Age 30, p.Jobs0 ); ); Without any kind of Lambda Expressions nLook how you can do the same query in C# 2.0 nWidth anonymous methods you can write in-line functions. nIts a bit faster, but a lot of people dont understand how they work. nYou can improve clarity by declaring explicit methods: class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; var qwhere = Linq.Where(people, delegate (Person p)return p.Age 20;); var qorderage = Linq.OrderByDescending(qwhere, delegate (Person p, Person q)return p.Age.CompareTo(q.Age);); var qthenbt = Linq.ThenBy(qorderage, delegate (Person p, Person q)return p.Name.CompareTo(q.Name);); var groupy = Linq.GroupBy(qthenbt,(Person p) = return p.CanCode;, delegate(Person p)return new PersonResume(p.Name, p.Age 30, p.Jobs0 ); ); Without anonymous methods nExplicit methods are easier than in-line functions! nJust write the method name to make a delegate? Sound simple! nWell, the correct way is to instantiate the delegate manually: class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; bool WhereCondition(Person p) return p.Age 20; int CompareAge(Person p,Person q) return p.Age.CompareTo(q.Age); int CompareName(Person p,Person q) return p.Name.CompareTo(q.Name); bool CanCode( Person p) return p.CanCode; PersonResume DoResume( Persona p) return new PersonResume( p.Name, p.Age 30, p.Jobs0 ); var qwhere = Linq.Where(people, WhereCondition); var qorderage = Linq.OrderByDescending(qwhere, CompareAge); var qthenbt = Linq.ThenBy(qorderage, CompareName); var groupy = Linq.GroupBy(qthenbt, CanCode, DoResume ); Without delegate inference nExplicit methods are easier than in-line functions! nFunc? Only Func? nMmm Its a generic delegate, but type information flow automatically, same as var nMaybe do it explicit is better for clarity class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; bool WhereCondition(Person p) return p.Age 20; int CompareAge(Person p,Person q) return p.Age.CompareTo(q.Age); int CompareName(Person p,Person q) return p.Name.CompareTo(q.Name); bool CanCode( Person p) return p.CanCode; PersonResume DoResume( Persona p) return new PersonResume( p.Name, p.Age 30, p.Jobs0 ); var qwhere = Linq.Where(people, new Func(WhereCondition); var qorderage = Linq.OrderByDescending(qwhere, new Func(CompareAge); var qthenbt = Linq.ThenBy(qorderage, new Func(CompareName); var groupy = Linq.GroupBy(qthenbt, new Func(CanCode), new Func(DoResume) ); Without type inference nNow type information are explicit on delegates (Func) and weve removed implicitly typed local variables (var) nOught, there is a lot of code here! Its because generics! Remove it! nAre you sure? C# 2.0 generics are grate for clarity, performance and type safety! nYeah! Go ahead! class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; bool WhereCondition(Person p) return p.Age 20; int CompareAge(Person p,Person q) return p.Age.CompareTo(q.Age); int CompareName(Person p,Person q) return p.Name.CompareTo(q.Name); bool CanCode( Person p) return p.CanCode; PersonResume DoResume( Persona p) return new PersonResume( p.Name, p.Age 30, p.Jobs0 ); IEnumerable qwhere = Linq.Where(people, new Func(WhereCondition); SortedSequence qorderage = Linq.OrderByDescending(qwhere, new Func(CompareAge); SortedSequence qthenbt = Linq.ThenBy(qorderage, new Func(CompareName); IEnumerable groupy = Linq.GroupBy(qthenbt, new Func(CanCode), new Func(DoResume); Without generics nWeve to renounce to C# 2.0 generics to use LINQ on Java. (what Java 1.5 has cant be called generics ) nWell, were now in C# 1.0. Again, you can do the same query!. nIts time for the final jump to Java!. nWe will start with delegates, why use delegates instead of interfaces? class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior;this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; bool WhereCondition(object p) return (Person)p).Age 20; int CompareAge(object p, object q) return (Person)p).Age.CompareTo(Person)q).Age); int CompareName(object p, object q) return (Person)p).Name.CompareTo(Person)q).Name); object CanCode(object p) return (Person)p).CanCode; object DoResume(object o) Person p = (Person)p; return new PersonResume( p.Name, p.Age 30, p.Jobs0 ); IEnumerable qwhere = Linq.Where(people, new WhereFunc(WhereCondition); SortedSequence qorderage = Linq.OrderByDescending(qwhere, new Comparer(CompareAge); SortedSequence qthenbt = Linq.ThenBy(qorderage, new Comparer(CompareName); IEnumerable groupy = Linq.GroupBy(qthenbt, new Func(CanCode), new Func(DoResume); Without delegates nInterfaces are more object-oriented than delegates! nOur work is almost complete! nTo target Java we have to remove Properties and Indexers, witch are less object oriented and dont really exist! class WhereCondition:IWhere bool Where(Person p) return p.Age 20; class CompareByAge: IComparer int Compare(object p, object q) return (Person)p).Age.CompareTo(Person)q).Age); class CompareByName: IComparer int Compare(object p, object q) return (Person)p).Name.CompareTo(Person)q).Name); class CodeGetter: IGetSomething object GetSomething(object p) return (Person)p).CanCode; class ResumeGetter: IGetSomething object GetSomething(object o) Person p = (Person)p; return new PersonResume( p.Name, p.Age 30, p.Jobs0 ); class PersonResume string _name; bool _senior; Job _firstJob; public PersonResum(string name, bool senior, Job firstJob) this._name = name; this._senior=senior; this._firstJob=firstJob; string Name get return _name; set _name = value; bool Senior get return _senior; set _senior = value; Job FirstJob get return _firstJob; set _firstJob = value; IEnumerable qwhere = Linq.Where(people, new WhereCondition(); SortedSequence qorderage = Linq.OrderByDescending(qwhere, new CompareByAge(); SortedSequence qthenbt = Linq.ThenBy(qorderage, new CompareByName(); IEnumerable groupy = Linq.GroupBy(qthenbt, new CodeGetter(), new ResumeGetter(); Without properties and indexers nMuch simplier! Just fields and methods! nOnly one step more! A good object oriented design should use one file for each class! class WhereCondition:IWhere bool Where(Person p) return p.getAge() 20; class CompareByAge: IComparer int Compare(object p, object q) return (Person)p).getAge().CompareTo(Person)q).getAge(); class CompareByName: IComparer int Compare(object p, object q) return (Person)p).getName().CompareTo(Person)q).getName(); class CodeGetter: IGetSomething object GetSomething(object p) return (Person)p).getCanCode(); class ResumeGetter: IGetSomething object GetSomething(object o) Person p = (Person)p; return new PersonResume( p.getName(), p.getAge() 30, p.getJobs().elementAt(0) ); class PersonResume string _name; bool _senior; Job _firstJob; public PersonResume(string name, bool senior, Job firstJob) this._name = name; this._senior=senior; this._firstJob=firstJob; string getName()return _name; void setName(string value) _name = value; bool getSenior()return _senior; void setSenior(bool senior)_senior = value; Job getFirstJob() return _firstJob; void setFirstJob()_firstJob = value; IEnumerable qwhere = Linq.Where(people, new WhereCondition(); SortedSequence qorderage = Linq.OrderByDescending(qwhere, new CompareByAge(); SortedSequence qthenbt = Linq.ThenBy(qorderage, new CompareByName(); IEnumerable groupy = Linq.GroupBy(qthenbt, new CodeGetter(), new ResumeGetter(); One class, One file nThe Wonderful world of Java! package stuff; public class WhereCondition implements IWhere bool Where(Person p) return p.getAge() 20; package stuff; public class PersonResume string _name; bool _senior; Job _firstJob; public PersonResume(string name, bool senior, Job firstJob) this._name = name; this._senior=senior; this._firstJob=firstJob; string getName()return _name; void setName(string value) _name = value; bool getSenior()return _senior; void setSenior(bool senior)_senior = value; Job getFirstJob() return _firstJob; void setFirstJob()_firstJob = value; IEnumerable qwhere = Linq.Where(people, new WhereCo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 呼和浩特市新城区公益性岗位招聘笔试真题2024
- 江苏苏州工业园区教育系统招聘教育人才笔试真题2024
- 历史城市文化传承规划基础知识点归纳
- 极地地区教学设计
- 绿色金融产融合作中面临的主要问题及挑战
- 高效行政工作总结
- 高中生物跨学科教学中探究式学习的实施策略
- 发心理学论文
- 2025至2030年中国滤波器用铁氧体磁芯行业投资前景及策略咨询报告
- 2025至2030年中国涤棉全线卡行业投资前景及策略咨询报告
- 粮油食材配送投标方案(大米食用油食材配送服务投标方案)(技术方案)
- 创业基础学习通超星期末考试答案章节答案2024年
- DB3301∕T 65.28-2024 反恐怖防范系统管理规范 第28部分:硬质隔离设施
- 三年级道德与法治下册 第一单元 我和我的同伴 4同学相伴教案 新人教版
- 传统纹样课程设计
- 便利店门店运营与管理实务考核试卷
- 光伏发电工程建设标准工艺手册(2023版)
- 江西省赣州市2024-2025学年高一物理下学期期末考试试题
- 2024版灯具安装劳务合同范文
- 2024研学旅行合同书
- 咖啡的微观世界智慧树知到期末考试答案章节答案2024年成都师范学院
评论
0/150
提交评论