为了节俭没必要的步骤,我就以截图来省略部分打字,
直接看文字可能没有直接看代码号,请参考一下代码做个简单的了解
首先看一下一个简单的 匿名内部类
@Test
public void test1() {
Comparator comparator = new Comparator() {
//原来的匿名内部类
@Override
public int compare(Integer o1, Integer o2) {//比较两个Integer大小
return Integer.compare(o1, o2);
}
};
TreeSet ts = new TreeSet<>(comparator);//匿名内部类的实例作为参数传递
}
而此段代码最重要的也就只有return的这一行代码,
而用Lambda表达式这可以这样写:
//lambda表达式
@Test
public void test2() {
Comparator comparator = (x,y) -> Integer.compare(x, y);
TreeSet ts = new TreeSet<>(comparator);
}
这就由原来的4行代码简约成1行,看起来也比较简洁,
这样一个小例子可能说服不了大家,具体请看下面更完整的代码演示。
我们做一个需求:
此段代码之前创建员工对象Employee,给出几个参数,构建有参构造,无参构造,
这些都是可以快捷键生成的,具体参考代码请点击此处:点我,我有完整示例代码,快来!!!
List employees = Arrays.asList(//先创建一个集合来存放员工信息
new Employee("张三", 11, 11111),
new Employee("李四", 22, 2222),
new Employee("王二", 33, 3333),
new Employee("麻子", 44, 4444)
);
//需求:获取当前公司年龄大于35的员工信息
@Test//调用试试
public void test3() {
List list = filterEmployee(employees);
for (Employee employee : list) {
System.out.println(employee);
}
}
//提取数据,
public List filterEmployee(Listlist){
List emps = new ArrayList<>();
for (Employee emp : list) {
if (emp.getAge() >=33) {
emps.add(emp);
}
}
return emps;
}
//以上代码方式完成的只是一个需求,若是完成多个需求可能会出现大量代码样式重复,
//优化方案:设计模式,匿名内部类,lambda表达式,streamAPI,完整代码请点击上面链接,
//优化方式1,策略设计模式
//此方法需求多了,可能会创建大量的类,
@Test
public void test4() {
List list = filterEmployee(employees,new FilterEmployeeByAge());
for (Employee employee : list) {
System.out.println(employee);
}
System.out.println("---------------------");
List list2 = filterEmployee(employees,new FilterEmployeeBySalary());
for (Employee employee : list2) {
System.out.println(employee);
}
}
public List filterEmployee(List list, Mypredicate mp){
List emps = new ArrayList<>();
for (Employee employee : list) {
if (mp.test(employee)) {
emps.add(employee);
}
}
return emps;
}
//优化方式二,匿名内部类
@Test
public void test5() {
List list = filterEmployee(employees,new Mypredicate() {
@Override
public boolean test(Employee t) {
return t.getSalary()<=3333;
}
});
for (Employee employee : list) {
System.out.println(employee);
}
}
给出Lambda表达式和StreamAPI实现方式
(大家可能看的没有一个很清晰的差别,因为代码多了可能会消磨人对空闲时间的利用率)
//优化方式3,Lambda表达式
@Test
public void test6() {
List list = filterEmployee(employees,(e) ->e.getSalary()>=3333);
list.forEach(System.out::println);
}
//优化方式4,StreamAPI
@Test
public void test7() {
employees.stream()
.filter((e) -> e.getSalary()>=3333)//获取薪资大于等于3333的
.limit(2)//猎取前两行
.forEach(System.out::println);
System.out.println("-----------------------");
employees.stream()
.map(Employee::getName)//获取员工名字
.forEach(System.out::println);
}
所以具体解释请看完整代码:
点我,我有完整示例代码,快来!!!