根据条件查询容器内的内容

大家好,我是聪聪,一个在写代码的小学生。今天总结一下最近的java学习代码。

随着学习的深入,发现解决问题的方法,往往有很多种,就比如下面问题的解决方法,但是有的时候需要根据具体情况,具体分析,具体解决。现在新的项目可能最低java8起步,但是往往咋修改老项目的时候,有些语法是不支持的。能多了解一种解决问题的方式是很有必要的。

废话不多说了,开始总结。

需求

  • 根据条件查询容器(List)内的内容
    • 需求:获取公司中年龄小于 35 的员工信息

    • 需求:获取公司中工资大于 5000 的员工信息

    • 实体

      package com.atguigu.java8;
      
      public class Employee {
      
      	private int id;
      	private String name;
      	private int age;
      	private double salary;
      
      	public Employee() {
      	}
      
      	public Employee(String name) {
      		this.name = name;
      	}
      
      	public Employee(String name, int age) {
      		this.name = name;
      		this.age = age;
      	}
      
      	public Employee(int id, String name, int age, double salary) {
      		this.id = id;
      		this.name = name;
      		this.age = age;
      		this.salary = salary;
      	}
      
      	public int getId() {
      		return id;
      	}
      
      	public void setId(int id) {
      		this.id = id;
      	}
      
      	public String getName() {
      		return name;
      	}
      
      	public void setName(String name) {
      		this.name = name;
      	}
      
      	public int getAge() {
      		return age;
      	}
      
      	public void setAge(int age) {
      		this.age = age;
      	}
      
      	public double getSalary() {
      		return salary;
      	}
      
      	public void setSalary(double salary) {
      		this.salary = salary;
      	}
      
      	@Override
      	public String toString() {
      		return "Employee [id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + "]";
      	}
      
      }
      
    • 初始化

      List<Employee> emps = Arrays.asList(
      			new Employee(101, "张三", 18, 9999.99),
      			new Employee(102, "李四", 59, 6666.66),
      			new Employee(103, "王五", 28, 3333.33),
      			new Employee(104, "赵六", 8, 7777.77),
      			new Employee(105, "田七", 38, 5555.55)
      	);
      

方法

  • Java7及以前

    • 方法一:for

      @Test
      	public void test3(){
      		List<Employee> list = filterEmployeeAge(emps);
      		
      		for (Employee employee : list) {
      			System.out.println(employee);
      		}
      	}
      
      //需求:获取公司中年龄小于 35 的员工信息
      	public List<Employee> filterEmployeeAge(List<Employee> emps){
      		List<Employee> list = new ArrayList<>();
      		
      		for (Employee emp : emps) {
      			if(emp.getAge() <= 35){
      				list.add(emp);
      			}
      		}
      		
      		return list;
      	}
      //需求:获取公司中工资大于 5000 的员工信息
      	public List<Employee> filterEmployeeSalary(List<Employee> emps){
      		List<Employee> list = new ArrayList<>();
      		
      		for (Employee emp : emps) {
      			if(emp.getSalary() >= 5000){
      				list.add(emp);
      			}
      		}
      		
      		return list;
      	}
      
    • 优化方法一:策略设计模式

      package com.atguigu.java8;
      
      @FunctionalInterface
      public interface MyPredicate<T> {
      
      	public boolean test(T t);
      	
      }
      
      //优化方式一:策略设计模式
      	public List<Employee> filterEmployee(List<Employee> emps, MyPredicate<Employee> mp){
      		List<Employee> list = new ArrayList<>();
      		
      		for (Employee employee : emps) {
      			if(mp.test(employee)){
      				list.add(employee);
      			}
      		}
      		
      		return list;
      	}
      	
      	@Test
      	public void test4(){
      		List<Employee> list = filterEmployee(emps, new FilterEmployeeForAge());
      		for (Employee employee : list) {
      			System.out.println(employee);
      		}
      		
      		System.out.println("------------------------------------------");
      		
      		List<Employee> list2 = filterEmployee(emps, new FilterEmployeeForSalary());
      		for (Employee employee : list2) {
      			System.out.println(employee);
      		}
      	}
      
      package com.atguigu.java8;
      
      public class FilterEmployeeForAge implements MyPredicate<Employee>{
      
      	@Override
      	public boolean test(Employee t) {
      		return t.getAge() <= 35;
      	}
      
      }
      
      package com.atguigu.java8;
      
      public class FilterEmployeeForSalary implements MyPredicate<Employee> {
      
      	@Override
      	public boolean test(Employee t) {
      		return t.getSalary() >= 5000;
      	}
      
      }
      
    • 优化方法二:策略设计模式+匿名内部类

      //优化方式二:匿名内部类
      	@Test
      	public void test5(){
      		List<Employee> list = filterEmployee(emps, new MyPredicate<Employee>() {
      			@Override
      			public boolean test(Employee t) {
      				return t.getId() <= 103;
      			}
      		});
      		
      		for (Employee employee : list) {
      			System.out.println(employee);
      		}
      	}
      
  • Java8

    • 优化方法三:策略设计模式+Lambda表达式

      @Test
      	public void test6(){
      		List<Employee> list = filterEmployee(emps, (e) -> e.getAge() <= 35);
      		list.forEach(System.out::println);
      		
      		System.out.println("------------------------------------------");
      		
      		List<Employee> list2 = filterEmployee(emps, (e) -> e.getSalary() >= 5000);
      		list2.forEach(System.out::println);
      	}
      
    • 优化方法四:StreamAPI

      //优化方式四:Stream API
      	@Test
      	public void test7(){
      		emps.stream()
      			.filter((e) -> e.getAge() <= 35)
      			.forEach(System.out::println);
      		
      		System.out.println("----------------------------------------------");
      		
      		emps.stream()
      			.map(Employee::getName)
      			.limit(3)
      			.sorted()
      			.forEach(System.out::println);
      	}
      

瞎说两句

  • java8开始,对于数据操作,不再依赖于数据库查询了。
  • java8语法的更新,使得我们写代码的时候,更加易读,更加直观。
  • 对于本题,对于Java7及其以前版本的系统,策略设计模式+匿名内部类的方式是我能找到的,最优的解决办法。
  • 设计模式:前辈们用来总结出来用来优化已存在过的问题的方法。
  • 如有错漏,请指出,谢谢。
  • 代码来源:尚硅谷JAVA8语法学习课程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值