jdk1.8新特性_Lambda表达式的引入

引入
需求: 获取工资大于20000的员工信息

public class Employee {private String name;private int age;private Double salary;public String address;public Employee() {}public Employee(String name, int age, Double salary, String address) {this.name = name;this.age = age;this.salary = salary;this.address = address;}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;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +", address='" + address + '\'' +'}';}
}--------------------------------------------------------------------
package com.gl;
import com.gl.domain.Employee;
import org.junit.Test;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class JDK8Test {//获取工资大于20000的员工信息List<Employee> emps = Arrays.asList(new Employee("张三", 23, 14000.11, "深圳"),new Employee("李四", 34, 26000.33, "北京"),new Employee("王五", 55, 18000.00, "上海"),new Employee("赵六", 32, 22000.88, "广州"),new Employee("田七", 23, 14000.11, "深圳"));@Testpublic List<Employee> getEmpInfo() {List<Employee> employees = new ArrayList<>();for (Employee emp : emps) {if (emp.getSalary() > 20000) {employees.add(emp);}}return employees;}
**//思考: 如果是提取年龄大于30  或者地址在深圳的,还是一通for循环,代码的可读性不高->抽取方法//新增一个接口MyPredicate  FilterEmployee 再实现此接口**public interface MyPredicate<T> {public boolean test(T t);}public class FilterEmployee  implements MyPredicate<Employee>{@Overridepublic boolean test(Employee employee) {return employee.getAge()>30;}
}//优化方式1 策略设计模式(缺点:每次都得创建类 实现接口FilterEmployee,太麻烦了)@Testpublic void test2() {List<Employee> employees = filterEmp(emps, new FilterEmployee());System.out.println("employees = " + employees);//李四  王五  赵六}public List<Employee> filterEmp(List<Employee> list, MyPredicate<Employee> mp) {ArrayList<Employee> ems = new ArrayList<>();for (Employee employee : list) {if (mp.test(employee)) {ems.add(employee);}}return ems;}//优化方式2:使用匿名内部类的方式处理(缺点:代码可读性差,不够简洁)@Testpublic void test3(){List<Employee> employees = filterEmp(emps, new MyPredicate<Employee>() {@Overridepublic boolean test(Employee employee) {return employee.getAge()>30;}});for (Employee employee : employees) {System.out.println("employee = " + employee);}//李四  王五  赵六}//优化方式3: 使用Lambda表达式@Testpublic void test4(){List<Employee> employees = filterEmp(emps, (employee) -> employee.getAge() > 30);employees.forEach(System.out::println);//李四  王五  赵六}//优化方式4 没有接口和实现类: 使用Lambda表达式 stream API@Testpublic void test5(){emps.stream().filter(employee -> employee.getAge() > 30).forEach(System.out::println);//李四  王五  赵六}-----------------------------------------------------------------------

**一. Lambda 表达式的基础语法:Java8中引用了一个新的操作符"->"该操作称为箭头操作符或

  •        Lambda 操作符,箭头操作符将Lambda 表达式分为两部分:
    
  • 左侧: Lambda表达式的参数列表
  • 右侧: Lambda 表达式中所需执行的功能,即 Lambda 体**
public class testLambda2 {//语法格式1: 无参数 无返回值@Testpublic void test1() {Runnable r = new Runnable() {@Overridepublic void run() {System.out.println("Hello KuGou!");}};r.run();//只打印  Hello KuGou!}/语法格式2:有一个参数 并且无返回值@Testpublic void test2(){Consumer<String> con = (x) -> System.out.println(x);con.accept("中国队 加油!");//语法3:若只有一个参数,小括号可以省略不写@Testpublic void test3(){Consumer<String> con = x -> System.out.println(x);con.accept("中国队 加油加油!");}//语法格式4:有两个以上的参数,有返回值,并且Lambda 体中有多条语句@Testpublic void test4() {Comparator<Integer> com = (x, y) -> {System.out.println("函数式接口");return Integer.compare(x, y);};}//语法5:若 Lambda 体中只有一条语句, return 和大括号都可以省略@Testpublic void test5() {Comparator<Integer> comparator = (Integer x, Integer y) -> Integer.compare(x, y);}//语法6: Lambda 表达式的类型参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,即"类型推断"@Testpublic void test6() {Comparator<Integer> comparator = ( x,  y) -> Integer.compare(x, y);}**/** 总结:* 上联:左右遇一括号省* 下联:左侧推断类型省* 横批:能省则省* * */**
}

二. Lambda 表达式需要"函数式接口"的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口.可以使用 @FunctionlInterface 注解修饰可以检测是否是函数式接口

//练习1@Testpublic void test11() {Collections.sort(emps, (e1, e2) -> {if (e1.getAge() == e2.getAge()) {return e1.getName().compareTo(e2.getName());} else {return -Integer.compare(e1.getAge(), e2.getAge());}});for (Employee emp : emps) {System.out.println("emp = " + emp);}}//练习2@Testpublic void test22() {String s = StringHandeler("  我的大中国呀   ", str -> str.trim());System.out.println("s = " + s);//s = 大中国String s2 = StringHandeler("good", str -> str.toUpperCase());System.out.println("s2 = " + s2); //s2 = GOODString s3 = StringHandeler("我的大中国呀", str -> str.substring(2,5));System.out.println("s3 = " + s3); //s3 = 大中国}//处理字符串的方法public String StringHandeler(String str, MyFunction f) {return f.getStr(str);}//练习3 定义函数式接口public interface MyFunction2<T,R> {public R getValue(T t1, T t2);}@Testpublic void test33(){op(100L,200L,(x,y)->x+y); //300op(100L,200L,(x,y)->x*y); //20000}//需求: 对两个Long 型数据进行处理public void op(Long l1,Long l2, MyFunction2<Long,Long> mf){System.out.println(mf.getValue(l1,l2));}






jdk1.8新特性_Lambda表达式的引入相关推荐

  1. java8新特性_Java8新特性_lambda表达式

    lambda介绍 λ ,希腊字母表中排序第十一位的字母,英语名称为Lambda. lambda 表达式,也可称为闭包,它是推动==Java 8== 发布的最重要新特性,允许把函数作为一个方法的参数(函 ...

  2. JDK1.8新特性Lambda表达式入门

    摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...

  3. jdk1.8新特性 Lambda表达式和Stream集合操作(详细)

    Lambda表达式 ① 语法 lambda表达式 ,是JDK1.8新增的特性 使用新的运算符 -> (转到.称为) lambda表达式的组成 第1部分: (参数) 第2部分: -> 第3部 ...

  4. JDK1.8 新特性(全)

    JDK1.8 新特性 本文主要介绍了JDK1.8版本中的一些新特性,乃作者视频观后笔记,仅供参考. jdk1.8新特性知识点: Lambda表达式 函数式接口 方法引用和构造器调用 Stream AP ...

  5. JDK1.8新特性及常用新特性

    JDK1.8的新特性 *Lambda表达式 新的日期API--Date time 引入Optional--防止空指针异常 *接口的默认方法和静态方法 *新增方法引用格式 *新增Stream类 注解相关 ...

  6. JDK1.8新特性总结

    背景: 因为面试被问到了,而且一直以来想去深入了解一下JDK 1.8的新特性 .才发现其实好多已经用在了项目中,自己没能察觉,所以总结一下,方便后期使用,以及加深理解. 主要有几点: 一. JCF 集 ...

  7. java基础知识总结:基础知识、面向对象、集合框架、多线程、jdk1.5新特性、IO流、网络编程

    目录 一.基础知识: 二.面向对象 三.集合框架 四.多线程: 五.jdk1.5的新特性 六.IO流 七.网络编程: 一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtua ...

  8. java lambda表达式详解_Java8新特性Lambda表达式详解

    课程目标: 通过本课程的学习,详细掌握Java8新特性之Lambda表达式: 适用人群:有Java基础的开发人员: 课程概述:从Java 8出现以来lambda是最重要的特性之一,它可以让我们用简洁流 ...

  9. java 1.7 可变参数,JDK1.7新特性(2):异常和可变长参数处理

    异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...

最新文章

  1. 2009年中国贫富标准线
  2. 測试人员的核心能力与素养
  3. [hdu4333]Revolving Digits
  4. Redis 字符串(String)
  5. zigbee定位_基于RFID室内定位技术的解决方案,能满足高精度室内定位吗?
  6. PHP上传文件大小限制的问题(转)
  7. Entityframework批量删除
  8. 频收罚单的浦发银行:增收不增利,曾遭骗贷数亿元,内控缺位?
  9. 国家电网面试题计算机类,国家电网招聘面试题及参考答案
  10. C语言程序100例之C#版-019
  11. Mac终端扫描附近wifi信号强度/信道
  12. 工厂中用计算机,计算机技术在工厂监控系统中的应用
  13. 英语学习网站超级大全(转载自豆瓣网)
  14. 中国城市生活节奏排行榜
  15. 英语句式参考纯享版 - 主语从句 - 表语从句
  16. 读书笔记《深度学习与图像识别原理与实践 大白话讲解对小白易懂》2022-8-5
  17. RetinaNet模型在DDSM数据集的应用问题(3)
  18. 【STM32训练—TOF激光测距模块】第一篇、STM32驱动TOF10120测量距离
  19. 爱快最新版3.6用docker安装Jellyfin最新教程
  20. 关于windows桌面网络图标显示未连接却可以上网的情况

热门文章

  1. class? clazz参数_Java如何获取方法参数具体名称?这是个好问题
  2. 无线设置 用户_【HIT每日学14】医院无线网络安全管理办法
  3. Spring Cloud Eureka 高可用注册中心
  4. 表单验证之validform.js使用方法
  5. mybatis sql xml 字符逃脱
  6. 输入框聚焦隐藏提示语
  7. 打包签名时出现Conversion to Dalvik format failed with error 1
  8. 手写分页 个人感觉还能优化,甚至抽象出来,需要高手讲解
  9. python中lambda()的用法_python中lambda()的用法
  10. HBase之HFile索引机制