1.2.3.3 简化写法:多条语句不可以省略大括号,带返回值(需手动加return)//多条语句不可以省略大括号,带返回值(需手动加return)Comparator<Integer> comparator3 = (o1,o2) -> {log.info("------ 比较原数值为:{},{}",o1,o2);return o1.compareTo(o2);};log.info("------ 使用lambda表达式,实现Comparator接口 , 比较22,22的大?。簕} ------",comparator3.compare(22,22));// 等于 0
1.3 java8中提供的函数式接口1.3.1消费型接口 Consumer (方法有一个参数,没有返回值)1.3.1.1 自定义方法 (使用接口的 void accept(T t))//自定义方法,带有一个消费型接口参数 , 可以实现一个方法,处理不同的业务场景static void useConsumer(Double salary,Consumer<Double> consumerDate){consumerDate.accept(salary);}
1.3.1.2 方法调用static void testLambdaConsumer(){//场景,同一个接口,有多个实现,以前,必须要创建接口的多个实现类 , 现在使用lambda,把接口的实现交给调用方法传递//实现1:Tom发了5000工资,去买手机,模拟接口的第一个实现//以前,必须提供接口的实现类对象useConsumer(5000.0,salary -> log.info("Tom,工资:{},5000买手机",salary));//实现1:Tom发了10000工资,去买手机,买平板,模拟接口的第二个实现//以前,必须提供接口的 两个 实现类对象useConsumer(10000.0,slary -> {log.info("JiMe工资:{},5000买手机",slary);log.info("JiMe工资:{},4000买平板",slary);});}
1.3.1.3 测试结果
文章插图
1.3.2 供给型接口Supplier(方法没有参数,可以返回任意类型的结果)1.3.2.1 自定义方法 (使用接口的 T get() )
//带一个供给型参数,可以实现同一个方法,处理实现同一个方法,处理不同的业务场景 , 给的数据不同,返回的结果不同static String useSupplier(Double salary, Supplier<Double> supplierData){//判断是否高薪的逻辑if(salary > supplierData.get()){return "高薪";}return "底薪";}
1.3.2.2 方法调用static void testLambdaSupplier(){//场景:不同的部门,针对高薪的判断条件不同 , 比如:学术部高于8000算高薪,教职部门高于5000算高薪//以前的写法:根据不同的不同 , 增加if...else 判断,随着部门的增加,你分的判断会越来越复杂log.info("--- 学术部:工资:{},是否高薪:{} ---",9000.0,useSupplier(9000.0,() -> 8000.0));log.info("--- 学术部:工资:{},是否高薪:{} ---",7000.0,useSupplier(7000.0,() -> 8000.0));log.info("--- 教职部:工资:{},是否高薪:{} ---",7000.0,useSupplier(7000.0,() -> 5000.0));log.info("--- 教职部:工资:{},是否高薪:{} ---",4000.0,useSupplier(7000.0,() -> 5000.0));}
1.3.2.3 测试结果文章插图
1.3.3 断言型接口 Predicate(方法有一个参数 , 有返回值-布尔类型)1.3.3.1 自定义方法 (使用接口的 boolean test(T t) )
//将判断条件交给调用方法static List<String> userPredicate(List<String> nameList, Predicate<String> predicateData){//定义要返回的姓名集合List<String> returnNameList = new ArrayList();//使用断言型接口,根据传过来的实现 , 返回不同的结果nameList.forEach(name ->{//调用断言型接口的test方法 , 进行挑选数据if(predicateData.test(name)){returnNameList.add(name);}});//返回符合条件的集合数据returnreturnNameList;}
1.3.3.2 方法调用static void testLambdaPredicate(){//使用场景//已知姓名集合 , 根据不同的场景,筛选不同的姓名结果List<String> nameList = Arrays.asList("Lilei","Hanmeinei","lisi","zhangsan","xiaolong","xiaohu");//获取姓名集合中所有包含n的姓名集合,可以定义第一个方法,实现//获取集合中包含i 或者a的姓名集合,可以定义第二个方法,实现//随着规则的改变 , 实现的方法越来越多,去简化,所有的方法就是判断规则不同,其他都一样,可以使用断言型接口,优化//获取姓名集合中所有包含n的姓名集合List<String> nameList_n = userPredicate(nameList,name -> name.contains("n"));log.info("姓名集合中所有包含n的姓名集合:{}",nameList_n);//获取集合中包含i 或者a的姓名集合List<String> nameList_i_a = userPredicate(nameList,name -> name.contains("i") || name.contains("a"));log.info("获取集合中包含i 或者a的姓名集合:{}",nameList_i_a);}
1.3.3.3 测试结果文章插图
1.3.4 函数接口 Function,有任意类型参数 , 有任意类型返回值1.3.4.1 自定义方法(使用接口的R apply(T t) ) 和 方法调用
推荐阅读
- 四 SpringBoot - 整合Mybatis,逆向工程,JPA
- 国窖1573和五粮液哪个档次高_国窖1573和五粮液哪个好喝
- 一篇文章带你掌握主流办公框架——SpringBoot
- 上海奢华五星级酒店——静安瑞吉ST REGIS 首先简单介绍一下瑞吉的的品牌背景
- 神舟5号资料 神舟五号资料
- 第五人格万圣节返场哪些皮肤
- 含具体案例 Java8新特性之Stream流
- 三 SpringBoot - Slf4j+logback 日志,异步请求,定时任务
- 五 微软出品自动化神器【Playwright+Java】系列 之常见点击事件操作
- 奥拉星手游石板解谜第五层怎么通关