JDK8-Lambda表达式(一)

来源:互联网 发布:芬尼根的守灵夜 知乎 编辑:程序博客网 时间:2024/05/16 01:39

使用Lambda可以简化开发,提高效率,先通过案例1入门Lambda,案例1还有策略设计模式的介绍

案例1:
相关JavaBean,熟悉一下之后直接看单元测试快速入门

实体:Emp.java

package cn.wcj.jdk8.lambda.test;//实体public class Emp {    private String empno   ;    private String ename    ;    private Double salary   ;    private Integer age     ;    public Emp() {}    public Emp(String empno, String ename, Double salary, Integer age) {        this.empno = empno;        this.ename = ename;        this.salary = salary;        this.age = age;    }    public String getEmpno() {        return empno;    }    public void setEmpno(String empno) {        this.empno = empno;    }    public String getEname() {        return ename;    }    public void setEname(String ename) {        this.ename = ename;    }    public Double getSalary() {        return salary;    }    public void setSalary(Double salary) {        this.salary = salary;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    @Override    public String toString() {        return "Emp [empno=" + empno + ", ename=" + ename + ", salary=" + salary + ", age=" + age + "]";    }}

策略设计模式的接口:MyPredicate.java

package cn.wcj.jdk8.lambda.test;//策略设计模式public interface MyPredicate<T> {    boolean filter(T entity)   ;   //过滤方法}

MyPredicate接口的实现类,按照年龄过滤:FilterEmpByAge .java

package cn.wcj.jdk8.lambda.test;public class FilterEmpByAge implements MyPredicate<Emp> {    @Override    public boolean filter(Emp entity) {        return entity.getAge()<35;    }}

MyPredicate接口的实现类,按照工资过滤:FilterEmpBySalary .java

package cn.wcj.jdk8.lambda.test;public class FilterEmpBySalary implements MyPredicate<Emp> {    @Override    public boolean filter(Emp entity) {        return entity.getSalary()>5000  ;    }}

单元测试,使用以上JavaBean来完成JDK8语法讲解

package cn.wcj.jdk8.lambda.test;import java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.List;import java.util.TreeSet;import org.junit.Test; import static  org.junit.Assert.*  ;/** * * <p>Title:LambdaTest1 </p>* <p>Description: Lambda表达式学习</p>* <p>Company:Software College </p> * @author SuccessKey(WangCJ)* @date 2017年6月17日 上午10:37:38 */@SuppressWarnings("unused")public class LambdaTest1 {    @Test    public void test1() {        Comparator<String> comparator = new Comparator<String>() {                @Override                public int compare(String o1, String o2) {                    return Integer.compare(o1.length(), o2.length())  ;                }        };        TreeSet<String> treeSet = new TreeSet<String>(comparator)  ;        TreeSet<String> treeSet2 = new TreeSet<String>(new Comparator<String>() {                @Override                public int compare(String o1, String o2) {                    return Integer.compare(o1.length(), o2.length())  ;                }        })  ;    }    //现在使用Lambda表达式    @Test    public void test2() {        Comparator<String> comparator=(x,y)->Integer.compare(x.length(), y.length())   ;        TreeSet<String> treeSet = new TreeSet<String>(comparator)   ;    }    List<Emp> emps=new ArrayList<Emp>(                Arrays.asList(                   new Emp("3333", "张三", 3333.33, 31),                             new Emp("4444", "李四", 4444.44, 41),                             new Emp("5555", "王五", 5555.55, 51),                             new Emp("6666", "赵六", 6666.66, 61),                             new Emp("7777", "田七", 7777.77, 71)                   )            );    //需求:获取公司中年龄小于 35 的员工信息    public List<Emp> filterEmpByAge(List<Emp> emps){         List<Emp> result=new ArrayList<Emp>()   ;         for (Emp emp : emps)              if(emp.getAge()<35)  result.add(emp)   ;         return result   ;    }    @Test    public void test3() {         List<Emp> result=filterEmpByAge(emps)  ;        for (Emp emp : result) {            System.out.println(emp);        }    }    //需求:获取公司中工资大于 5000 的员工信息    public List<Emp> filterEmpBySalary(List<Emp> emps){         List<Emp> result=new ArrayList<Emp>()   ;        for (Emp emp : emps)          if(emp.getSalary()>5000)  result.add(emp)   ;        return result   ;    }    @Test    public void test4() {         List<Emp> result=filterEmpBySalary(emps)  ;        for (Emp emp : result) {            System.out.println(emp);        }    }    //优化1:策略设计模式    public List<Emp> filterEmp(List<Emp> emps,MyPredicate<Emp> myPredicate){         List<Emp> result=new ArrayList<Emp>()   ;            for (Emp emp : emps)              if(myPredicate.filter(emp))  result.add(emp)   ;            return result   ;    }    @Test    public void test5() {        List<Emp> result=filterEmp(emps,new FilterEmpByAge())  ;        for (Emp emp : result) {            System.out.println(emp);        }        System.out.println("-----------------------------------");        List<Emp> result2=filterEmp(emps,new FilterEmpBySalary())  ;        for (Emp emp : result2) {            System.out.println(emp);        }    }    //优化2:匿名内部类    @Test    public void test6() {        List<Emp> result=filterEmp(emps,new MyPredicate<Emp>() {            @Override            public boolean filter(Emp entity) {                return entity.getAge()>50 && entity.getSalary()>6000;            }        })  ;        for (Emp emp : result) {            System.out.println(emp);        }    }    //优化3:Lambda 表达式    @Test    public void test7() {        List<Emp> result=filterEmp(emps,(e)->e.getAge()<35)  ;        result.forEach(System.out::println);        System.out.println("----------------------------");        List<Emp> result2=filterEmp(emps,(e)->e.getSalary()>5000)  ;        result2.forEach(System.out::println);    }    //优化4:Stream API    @Test    public void test8() {        emps.stream()            .filter((e)->e.getAge()<35)            .forEach(System.out::println)  ;        System.out.println("---------------------------------------")  ;        emps.stream()            .filter((e)->e.getSalary()>5000)            .limit(2)            .map(Emp::getSalary)            .sorted()            .forEach(System.out::println);    }}

案例2:介绍Lambda表达式的基础语法,所有总结在单元测试上

函数式接口,看后面单元测试的注释和方法就会明白,暂时不明白没关系

package cn.wcj.jdk8.lambda.test;/** * * <p>Title:MyFun </p>* <p>Description: 函数式接口</p>* <p>Company:Software College </p> * @author SuccessKey(WangCJ)* @date 2017年6月17日 下午9:10:21 */@FunctionalInterfacepublic interface MyFun<T> {    T getVal(T target)     ;}
package cn.wcj.jdk8.lambda.test;import java.util.ArrayList;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.function.Consumer;import org.junit.Test;/* * 一、Lambda 表达式的基础语法:Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符 *                          箭头操作符将 Lambda 表达式拆分成两部分: *  * 左侧:Lambda 表达式的参数列表 * 右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体 *  * 语法格式一:无参数,无返回值 *      () -> System.out.println("Hello Lambda!"); *  * 语法格式二:有一个参数,并且无返回值 *      (x) -> System.out.println(x) *  * 语法格式三:若只有一个参数,小括号可以省略不写 *      x -> System.out.println(x) *  * 语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句 *      Comparator<Integer> com = (x, y) -> { *          System.out.println("函数式接口"); *          return Integer.compare(x, y); *      }; * * 语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写 *      Comparator<Integer> com = (x, y) -> Integer.compare(x, y); *  * 语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断” *      (Integer x, Integer y) -> Integer.compare(x, y); *  * 上联:左右遇一括号省 * 下联:左侧推断类型省 * 横批:能省则省 *  * 二、Lambda 表达式需要“函数式接口”的支持 * 函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰 *           可以检查是否是函数式接口 */public class LambdaTest2 {    @Test    public void test1() {        int num =1   ;   //jdk7必须加final        Runnable runnable = new Runnable() {            @Override            public void run() {                System.out.println("HelloWorld!!! "+num);            }        };        new Thread(runnable).start();           Runnable runnable2=()->System.out.println("HelloLambda!!! "+num);        new Thread(runnable2).start()  ;     }    @Test    public void test2() {        //Consumer<String> consumer=(msg)->System.out.println("msg:"+msg);        Consumer<String> consumer=msg->System.out.println("msg:"+msg);        consumer.accept("我大软院威武!!!");    }    @Test    public void test3() {        Comparator<Integer> comparator=(x,y)->{            System.out.println("函数式接口") ;            return Integer.compare(x, y)   ;        }   ;    }    @Test    public void test4() {        Comparator<Integer> comparator=(x,y)->Integer.compare(x, y)   ;    }    @Test    public void test5() {        //String[] strs= {"a","b","c"}  ;        //      String[] strs  ;        //      strs= new String[]{"a","b","c"}  ;        List<String> list=new ArrayList<>()  ;        show(new HashMap<>());   //jdk7不支持    }    public void show(Map<String, Integer> map){}    public Integer operator(Integer num,MyFun<Integer> myFun) {           return myFun.getVal(num) ;    }    @Test    public void test6() {        Integer result = operator(100,(x)->x*x)   ;        System.out.println("result:"+result)      ;        System.out.println("------------------------------")  ;        System.out.println("result:"+operator(1000, x->x+888));    }}