大家好,我是聪聪,一个在写代码的小学生。今天总结一下最近的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语法学习课程。