使用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
 */
@FunctionalInterface
public 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));

    }


}