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)); }}
阅读全文
0 0
- JDK8-Lambda表达式(一)
- Jdk8之lambda表达式的使用(一)
- Jdk8之lambda表达式的使用(一)
- jdk8中的lambda表达式
- JDK8 lambda表达式
- JDK8 Lambda表达式教程
- JDK8 ——lambda表达式
- jdk8使用lambda表达式排序
- jdk8新特性->lambda表达式
- JDK8新特性之Lambda表达式
- Jdk8之lambda表达式的使用(二)
- JDK8新特性之Lambda表达式
- jdk8新特性 lambda表达式详解
- jdk8新特性之lambda表达式
- Jdk8之lambda表达式的使用(二)
- JDK8中Lambda表达式的使用
- JDK8新特性之Lambda表达式
- JDK8新特性之Lambda表达式
- jsp总结1
- win10下使用nltk的brown的词性tag包报错以及处理方法安装nltk相应包的操作办法
- WebGoat开发版配置
- Dalvik指令
- IAP+YMODEM+CRC16+AES256+PC端软件+hex合并
- JDK8-Lambda表达式(一)
- LRC纵向冗余校验
- hive仓库和关系型数据库的对比
- 考研
- Win10 64bit下安装GPU版Tensorflow+Keras
- c++远征之模板篇——函数模板、类模板
- 再谈Comparator-使用lambda表达式
- Java实现-数字组合1
- poj2081