Java8新特性(一)—————Lambda表达式

关注微信公众号【行走在代码行的寻路人】获取Java学习视频及资料。

简述Java8中的新特性:

1.速度快:两个对象比较,采用红黑树替换了链表,使其速度变快新增的速度比较与链表较慢

2.新增Lambda表达式使代码更简洁

3.强大的StreamAPI

4.便于并行

5.最大化减少空指针异常

核心部分为:Lambda表达式和StreamAPI

Lambda相关案例如下:

package com.company.test;

import org.junit.Test;

import java.util.*;

/**
 * Java8特性,从匿名类转换到Lambda
 */
public class MainTest01 {

    /**
     * 原始的匿名类
     */
    @Test
    public void test1(){
        Comparator<String> com = new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(), o2.length());
            }
        };

        TreeSet<String> ts = new TreeSet<>(com);

        TreeSet<String> ts2 = new TreeSet<>(new Comparator<String>(){
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(), o2.length());
            }
        });
    }

    /**
     * Java8中的Lambda表达式
     */
    @Test
    public void test2(){
        Comparator<String> com = (x, y) -> Integer.compare(x.length(), y.length());
        TreeSet<String> ts = new TreeSet<>(com);
    }

    /**
     定义测试数据
     */
    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)
    );

    /**
     * 需求1:获取年龄小于30岁的人员信息
     * 传统写法
     */
    public List<Employee> filterEmployeeByAge(List<Employee> epms){
           List<Employee> list = new ArrayList<Employee>();

        for (Employee epm : epms) {
            if(epm.getAge()<30){
                list.add(epm);
            }
        }
        return list;
    }

    @Test
    public void test3(){
        List<Employee> employees = filterEmployeeByAge(emps);
        for (Employee employee : employees) {
            System.out.println(employee);
        }
    }

    /**
     * 需求2:获取工资大于5000的人员信息
     * 传统写法
     */
    public List<Employee> filterEmployeeBySalary(List<Employee> employes){
        List<Employee> list = new ArrayList<Employee>();
        for (Employee employe : employes) {
            if(employe.getSalary()>5000){
                list.add(employe);
            }
        }
        return list;
    }

    @Test
    public void test4(){
        List<Employee> employees = filterEmployeeBySalary(emps);
        for (Employee employee : employees) {
            System.out.println(employee);
        }
    }

    /**
     * 优化上面需求方式1:
     *  采用设计模式:策略设计模式
     *  此方法的缺陷是每个过滤都要建立一个类去实现接口
     */
    public List<Employee> filterEmployee(List<Employee> employees ,MyPredicate<Employee> myPredicate){
        List<Employee> list = new ArrayList<Employee>();
        for (Employee employee : employees) {
            if(myPredicate.filterInfo(employee)){
                list.add(employee);
            }
        }
        return list;
    }

    @Test
    public void test5(){
        List<Employee> employees = filterEmployee(emps, new FiltereEmployeeAge());
        for (Employee employee : employees) {
            System.out.println(employee);
        }

        System.out.println("================================================");

        List<Employee> employees1 = filterEmployee(emps,new FiltereEmployeeSalary());
        for (Employee employee : employees1) {
            System.out.println(employee);
        }
    }

    /**
     * 需求优化2:匿名内部类
     * 即重写接口里面的过滤方法
     */
    @Test
    public void test6(){
        List<Employee> employees = filterEmployee(emps, new MyPredicate<Employee>() {
            @Override
            public boolean filterInfo(Employee employee) {
                return employee.getAge()<20;
            }
        });
        for (Employee employee : employees) {
            System.out.println(employee);
        }
    }

    /**
     * 需求优化4:采用Java8 新特性,Lambda表达式
     */
    @Test
    public void test7(){
        List<Employee> employees = filterEmployee(emps, (e) -> e.getAge() > 30);
        employees.forEach(System.out::println);

        System.out.println("======================================");

        List<Employee> employees1 = filterEmployee(emps,(e)->e.getSalary()>5000);
        employees1.forEach(System.out::println);
    }

    /**
     * 需求优化5:采购Java8新特性,Stream API
     */
    @Test
    public void test8(){
        emps.stream()
            .filter(e->e.getAge()>30)
            .forEach(System.out::println);

        System.out.println("======================================");

        //获取前面的一条数据
        emps.stream().filter(e->e.getAge()>30).limit(1).forEach(System.out::println);
    }





}
package com.company.test;

public class Employee {

	private int id;
	private String name;
	private int age;
	private double salary;

	public Employee(){
	}

	public Employee(int id, String name, int age, double salary) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.salary = salary;
	}

	@Override
	public String toString() {
		return "Employee{" +
				"id=" + id +
				", name='" + name + '\'' +
				", age=" + age +
				", 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;
	}
}
package com.company.test;

public class FiltereEmployeeAge implements MyPredicate<Employee> {
    @Override
    public boolean filterInfo(Employee employee) {
        return employee.getAge()<30;
    }
}
package com.company.test;

public class FiltereEmployeeSalary implements MyPredicate<Employee> {
    @Override
    public boolean filterInfo(Employee employee) {
        return employee.getSalary()>5000;
    }
}
package com.company.test;

public interface MyPredicate<T> {

    public boolean filterInfo(T t);
}

需要学习资料和了解程序猿技术每日杂志的可以关注下微信公众【行走在代码行的寻路人】后续持续更新每天学习心得跟方法,跟大家一起成长!

发布了101 篇原创文章 · 获赞 10 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/WMY1230/article/details/102762009