查询符合规定公司职员,使用匿名类实现。
传统写法:
w List allmembers=company.getMembers();// 取得所有成员
w List results=new ArrayList();// 结果列表
w
w for(Iterator it=allmembers.iterator();it.hasNext();){
w Member member=(Member)it.next();
w
w if(member.getAge()>22 && member.isMale()){ // 筛选,这里是把查询条件和遴选过程融合在一起,条件一变立即就得加个分支.
w results.add(member);
w }
w }
这种写法没有错,但是不是面向对象的写法,它有以下缺陷:
1.查询条件和筛选过程没有分离.
2.这样写的后果使Company变成了一个失血模型而不是领域模型.
3.换查询条件的话,上面除了"筛选"一句有变化外其它都是模板代码,重复性很高.
真正符合OO的查询应该是这样:
w Filter filter1=new Filter(){
w public boolean isPassed(Member member) {
w return member.isMale() && member.getAge()>22;
w }
w };
w
w List ls=company.listMembers(filter1);
w
w这段代码成功的把查询条件作为一个接口分离了出去,接口代码如下:
wpublic interface Filter {
public boolean isPassed(Member member);
}
完整代码:
成员类:
package com.xzy;
/**
* 职员类
* @author xizhenyin
*
*/
public class Member {
private String name;
private boolean isMale;
private int age;
private int salary;
public Member(String name,boolean isMale,int age,int salary){
this.name = name;
this.isMale = isMale;
this.age = age;
this.salary = salary;
}
public String toString(){
return "姓名"+name+" "+"性别"+isMale+" "+"年龄"+age+" "+"月薪"+salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isMale() {
return isMale;
}
public void setMale(boolean isMale) {
this.isMale = isMale;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
公司类
package com.xzy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 公司类
* @author xizhenyin
*
*/
public class Company {
private List<Member> members;
public Company(){
members = new ArrayList<Member>();
}
public void addMembers(Member m){
members.add(m);
}
public List searchMember(Filter filter1){
List<Member> retval = new ArrayList<Member>();
for(Iterator it = members.iterator();it.hasNext();){
Member m = (Member)it.next();
if(filter1.isPassed(m)){
retval.add(m);
}
}
return retval;
}
}
接口
package com.xzy;
/**
* 接口
* @author xizhenyin
*
*/
public interface Filter {
public boolean isPassed(Member member);
}
测试
package com.xzy;
/**
* 实现
*/
import java.util.ArrayList;
import java.util.List;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Member> l = new ArrayList<Member>();
Company c = new Company();
c.addMembers(new Member("AA", false, 24, 1800));
c.addMembers(new Member("DG", false, 25, 2000));
c.addMembers(new Member("GH", true, 22, 1600));
c.addMembers(new Member("QQ", false, 24, 1900));
c.addMembers(new Member("BN", true, 24, 2000));
c.addMembers(new Member("PP", true, 26, 2200));
c.addMembers(new Member("WE", false, 23, 2000));
// 匿名类
Filter filter = new Filter() {
@Override
//查询条件
public boolean isPassed(Member member) {
return (member.isMale()==true&&member.getAge() > 20 && member.getSalary() > 1300);
}
};
l = c.searchMember(filter);
for (Member member : l) {
System.out.println(member);
}
}
}
结果:
姓名GH 性别true 年龄22 月薪1600
姓名BN 性别true 年龄24 月薪2000
姓名PP 性别true 年龄26 月薪2200
分享到:
相关推荐
由于C#中,匿名类可以被编译器自动实现Equals方法,因此我们可以使用匿名类来比较两个对象是否相等。 C#中LINQ多条件JOIN时可以使用匿名类的原因是因为C#中,对匿名类进行了重写,使得匿名类可以像具名类一样使用。...
在这个主题中,我们将深入探讨"进度条"、"Lambda表达式"、"匿名方法"、"委托"、"类"、"集合"以及"初始化"这些核心概念,它们都是.NET框架中的重要组成部分。 首先,让我们来看一下"进度条"。在开发用户界面时,...
总的来说,这个压缩包文件的内容可能详细介绍了如何设计和实现这样的匿名DNS查询系统,分析其工作原理、性能和安全性,以及可能面临的挑战与应对策略。对于关注网络隐私和安全的专业人士来说,这是一个非常有价值的...
EntityFramework通过它的 DbContext 和 DbSet 类实现了这一功能。DbContext 是应用程序中与数据库交互的主要上下文,DbSet 代表了数据库中的表或集合。通过这些类,我们可以方便地进行添加、删除、更新和查询数据。 ...
本知识库将详细介绍如何使用匿名类、DataTable、SQL语句生成实体类。 首先,我们需要了解几种场景下实体类生成的需求: 1. EF或LINQ查询可能返回匿名对象,但这些对象在其他地方调用时不方便,手动创建实体类又...
匿名委托通常与事件处理或 LINQ 查询一起使用。在C#中,我们可以通过lambda表达式来创建匿名委托。例如: ```csharp // 使用匿名委托进行简单的操作 Action myAction = () => Console.WriteLine("Hello, World!"); ...
在EF中,当我们使用LINQ查询并返回多个属性的集合时,会经常用到匿名类型。例如,`var users = context.Users.Select(u => new { u.FirstName, u.LastName }).ToList();`这里创建了一个匿名类型,包含用户的...
匿名使用:用户可以选择不登录,匿名使用小程序的基本功能。 2. 垃圾分类查询 垃圾识别:用户可以通过拍照上传或文字输入方式查询垃圾的分类信息。 分类标准:提供详细的垃圾分类标准和说明,包括可回收物、有害垃圾...
本主题聚焦于如何将`Expression<Func<T>>`转换为`Expression, object>>`,这在某些场景下是必要的,比如当我们想要返回一个匿名类型或进行更灵活的查询操作时。 `Expression<Func<T>>`表示的是一个无参数的Lambda...
总结,通过使用Linq,我们可以轻松地实现RSS聚合功能,其简洁的语法和强大的查询能力使得处理XML数据变得非常直观。无论你是初学者还是经验丰富的开发者,掌握Linq都是提升.NET开发效率的重要一步。在实际项目中,...
数据的持久化通常通过数据库实现,如使用Java的JDBC(Java Database Connectivity)接口连接MySQL或SQLite等数据库。 JDBC允许Java程序与各种类型的数据库进行交互。开发者需要编写SQL语句来操作数据,如INSERT用于...
在探讨网络空间安全的文章中,作者们提出了一个新的概念,即通过查询块交换实现个性化匿名。这种技术特别针对位置服务(LBS)中的隐私保护问题。在当前的位置服务系统中,用户往往需要提交位置相关的信息来获取便捷...
- **匿名类型**:在LINQ查询中,可以创建匿名类型的实例,用于临时存储查询结果。 - **Lambda表达式**:作为LINQ的核心部分,Lambda表达式用于定义查询的操作,如选择、过滤等。 ### 2. LINQ to SQL - **数据上...
2. **Lambda表达式**:Lambda表达式可以用来创建匿名函数,常在LINQ查询中使用,简化了数据库查询的写法。例如,`db.Users.Where(u => u.Username == "admin")` 是一个查找用户名为"admin"的用户的查询。 3. **...
7. **匿名方法和Lambda表达式**:在C#中,你可以使用匿名方法或Lambda表达式来实现接口中的方法,这在事件处理或LINQ查询中非常常见。 8. **接口的版本控制**:如果需要添加新的成员到接口,而不想影响已实现该接口...
1. 使用MySQL建立数据库,创建用户表、主题表和评论表,并在Dao层定义实体类和接口,通过MyBatis配置文件实现与数据库的连接。 2. 在Service层利用Spring的控制反转,自动装配Bean,简化对象的创建。 3. Controller...
这一功能由ServletLogin类实现,它响应POST请求,通过查询数据库中的vote_admin表来验证管理员信息。 2. **用户投票模块**:用户可以查看投票内容,进行投票,并查看投票结果。模块分为两个部分:显示投票内容和...
5. **AmType.cs**:虽然这个文件名没有提供足够的上下文,但可能表示一个特定的实体类或查询结果类,用于存储多表查询后的结果。 综上所述,多表查询在ORM中是通过实体关系映射和Linq查询来实现的。通过合理地设计...
在“java函数使用查询包”中,我们可能找到了两个与Java函数使用相关的资源:`javascript.chm`和`JavaScript5.5 参数速查.rar`。虽然文件名中包含了"javascript",但考虑到标签为"java",我们将重点放在Java函数的...