`
xizhenyin
  • 浏览: 53048 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

使用匿名类实现的查询

阅读更多

      查询符合规定公司职员,使用匿名类实现。

 

传统写法:

 
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

 

w
 
 

w


分享到:
评论

相关推荐

    C#中LINQ多条件JOIN时为什么可以使用匿名类

    由于C#中,匿名类可以被编译器自动实现Equals方法,因此我们可以使用匿名类来比较两个对象是否相等。 C#中LINQ多条件JOIN时可以使用匿名类的原因是因为C#中,对匿名类进行了重写,使得匿名类可以像具名类一样使用。...

    进度条.Lambda表达式.匿名方法.委托.类.集合.初始化

    在这个主题中,我们将深入探讨"进度条"、"Lambda表达式"、"匿名方法"、"委托"、"类"、"集合"以及"初始化"这些核心概念,它们都是.NET框架中的重要组成部分。 首先,让我们来看一下"进度条"。在开发用户界面时,...

    行业分类-外包设计-减少DNS递归服务器上隐私泄漏的匿名查询方法及系统的介绍分析.rar

    总的来说,这个压缩包文件的内容可能详细介绍了如何设计和实现这样的匿名DNS查询系统,分析其工作原理、性能和安全性,以及可能面临的挑战与应对策略。对于关注网络隐私和安全的专业人士来说,这是一个非常有价值的...

    EntityFramework数据持久化复习资料2、隐式与匿名类型同匿名函数的使用(包含匿名对象列表遍历)Demo5是Web项目

    EntityFramework通过它的 DbContext 和 DbSet 类实现了这一功能。DbContext 是应用程序中与数据库交互的主要上下文,DbSet 代表了数据库中的表或集合。通过这些类,我们可以方便地进行添加、删除、更新和查询数据。 ...

    ASP.NET中实现根据匿名类、datatable、sql生成实体类

    本知识库将详细介绍如何使用匿名类、DataTable、SQL语句生成实体类。 首先,我们需要了解几种场景下实体类生成的需求: 1. EF或LINQ查询可能返回匿名对象,但这些对象在其他地方调用时不方便,手动创建实体类又...

    匿名委托及Stopwatch

    匿名委托通常与事件处理或 LINQ 查询一起使用。在C#中,我们可以通过lambda表达式来创建匿名委托。例如: ```csharp // 使用匿名委托进行简单的操作 Action myAction = () =&gt; Console.WriteLine("Hello, World!"); ...

    EntityFramework数据持久化复习资料2、隐式与匿名类型同匿名函数的使用,包含DPF与完整的示例,下载后可直接使用测试

    在EF中,当我们使用LINQ查询并返回多个属性的集合时,会经常用到匿名类型。例如,`var users = context.Users.Select(u =&gt; new { u.FirstName, u.LastName }).ToList();`这里创建了一个匿名类型,包含用户的...

    垃圾分类-WeChat-基于微信小程序的垃圾分类设计与实现(毕业论文)

    匿名使用:用户可以选择不登录,匿名使用小程序的基本功能。 2. 垃圾分类查询 垃圾识别:用户可以通过拍照上传或文字输入方式查询垃圾的分类信息。 分类标准:提供详细的垃圾分类标准和说明,包括可回收物、有害垃圾...

    net Lamada表达式转匿名对象

    本主题聚焦于如何将`Expression&lt;Func&lt;T&gt;&gt;`转换为`Expression, object&gt;&gt;`,这在某些场景下是必要的,比如当我们想要返回一个匿名类型或进行更灵活的查询操作时。 `Expression&lt;Func&lt;T&gt;&gt;`表示的是一个无参数的Lambda...

    使用linq实现rss聚合

    总结,通过使用Linq,我们可以轻松地实现RSS聚合功能,其简洁的语法和强大的查询能力使得处理XML数据变得非常直观。无论你是初学者还是经验丰富的开发者,掌握Linq都是提升.NET开发效率的重要一步。在实际项目中,...

    Java课程设计学生信息管理系统源码,带GUI界面,基于swing开发

    数据的持久化通常通过数据库实现,如使用Java的JDBC(Java Database Connectivity)接口连接MySQL或SQLite等数据库。 JDBC允许Java程序与各种类型的数据库进行交互。开发者需要编写SQL语句来操作数据,如INSERT用于...

    通过查询块交换实现个性化匿名

    在探讨网络空间安全的文章中,作者们提出了一个新的概念,即通过查询块交换实现个性化匿名。这种技术特别针对位置服务(LBS)中的隐私保护问题。在当前的位置服务系统中,用户往往需要提交位置相关的信息来获取便捷...

    通过linq技术对数据实现查询修改等操作

    - **匿名类型**:在LINQ查询中,可以创建匿名类型的实例,用于临时存储查询结果。 - **Lambda表达式**:作为LINQ的核心部分,Lambda表达式用于定义查询的操作,如选择、过滤等。 ### 2. LINQ to SQL - **数据上...

    EF框架实现登陆的Demo

    2. **Lambda表达式**:Lambda表达式可以用来创建匿名函数,常在LINQ查询中使用,简化了数据库查询的写法。例如,`db.Users.Where(u =&gt; u.Username == "admin")` 是一个查找用户名为"admin"的用户的查询。 3. **...

    C# 接口,接口的操作类

    7. **匿名方法和Lambda表达式**:在C#中,你可以使用匿名方法或Lambda表达式来实现接口中的方法,这在事件处理或LINQ查询中非常常见。 8. **接口的版本控制**:如果需要添加新的成员到接口,而不想影响已实现该接口...

    《Whisper悄悄话—匿名提问箱》小组实验报告1

    1. 使用MySQL建立数据库,创建用户表、主题表和评论表,并在Dao层定义实体类和接口,通过MyBatis配置文件实现与数据库的连接。 2. 在Service层利用Spring的控制反转,自动装配Bean,简化对象的创建。 3. Controller...

    网上电子投票系统中服务器端的实现

    这一功能由ServletLogin类实现,它响应POST请求,通过查询数据库中的vote_admin表来验证管理员信息。 2. **用户投票模块**:用户可以查看投票内容,进行投票,并查看投票结果。模块分为两个部分:显示投票内容和...

    orm 多表查询实体解决办法

    5. **AmType.cs**:虽然这个文件名没有提供足够的上下文,但可能表示一个特定的实体类或查询结果类,用于存储多表查询后的结果。 综上所述,多表查询在ORM中是通过实体关系映射和Linq查询来实现的。通过合理地设计...

    java函数使用查询包

    在“java函数使用查询包”中,我们可能找到了两个与Java函数使用相关的资源:`javascript.chm`和`JavaScript5.5 参数速查.rar`。虽然文件名中包含了"javascript",但考虑到标签为"java",我们将重点放在Java函数的...

Global site tag (gtag.js) - Google Analytics