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