1.1lambda表达式简介
lambda表达式可以用非常少的代码实现抽象方法。lambda表达式不能独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。lambda表达式的语法非常特殊。
()->结果表达式
参数->结果表达式
(参数1,参数2...参数n)->结果表达式
lambda表达式的语法非常抽象,并且有着非常强大的自动化功能,如自动识别泛型、自动数据类型转换等
例题
package fourteen;
interface SayhHi{
String say();//抽象方法接口
}
public class NoParamDemo {
public static void main(String[] args) {
//无参数
//利用匿名内部类补全方法体
SayhHi sh1 = new SayhHi() {
public String say() {
return "这是匿名内部类";
}
};
System.out.print(sh1.say());
}
}
lambda表达式语法用如下方式理解:
() -> {代码块}
这个方法 按照 这样的代码来实现
package fourteen;
interface sayhi{
String say();
}
public class NoParamDemo {
public static void main(String[] args) {
//使用匿名内部类补全方法体
sayhi shi = new sayhi() {
public String say() {
return"这是匿名内部类";
}
};
System.out.println(shi.say());
//使用lambda表达式补全方法体
sayhi sh2 = ()->{
return"lambda";
};
System.out.println(sh2.say());
}}
例题
package fourteen;
interface AddInt{
int add(int a,int b);//抽象方法接口
}
public class Prama {
public static void main(String[] args) {
//有参数
//利用匿名内部类补全方法体
AddInt ai1 = new AddInt() {
public int add(int a,int b){
return a+b;
}
};
System.out.println("匿名内部类:" + ai1.add(3, 5));
//利用lambda表达式补全方法体
AddInt ai2=( a, b) -> {
return a+b ;
};
System.out.println("lambda表达式:"+ai2.add(3, 5));
}
}
package fourteen;
interface CheckGrade{
String check(int grade);//查询成绩结果
}
public class GradeDemo {
public static void main(String[] args) {
CheckGrade g =(n)->{ //lambda表达式实现代码块
if(n>=90&&n<=100) { //如果成绩在90~100
return "成绩为优"; //输出成绩为优
}else if(n>=80&&n<90) { //如果成绩在80~90
return "成绩为良"; //输出成绩为良
}else if(n>=60&&n<80) { //如果成绩在60~79
return"成绩为中"; //输出成绩为中
}else if (n>0&&n<60) { //如果成绩小于60
return "成绩为差"; //输出成绩为差
}else { //其他数字不是有效成绩
return"成绩无效"; //输出成绩无效
}
}; //不要丢掉lambda语句后的分号
System.out.println(g.check(89)); //输出查询结果
}
}
引用成员方法:
package fourteen;
import java.text.SimpleDateFormat;
import java.util.Date;
interface MetodDemoInterface{ //创建测试接口
String method(Date date); //带参数的抽象方法
}
public class MethodDemo {
public String format(Date date) { //格式化方法
//创建日期格式化对象,并指定日期格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date); //返回格式化结果
}
public static void main(String[] args) {
MethodDemo demo =new MethodDemo(); //创建类对象
MetodDemoInterface im =demo::format; //引用类对象的方法
Date date =new Date(); //创建日期对象
System.out.println("默认格式:"+date); //输出日期对象默认格式
System.out.println("接口输出的格式"+im.method(date));//输出经过接口方法处理过的格式
}
}
2.引用泛型方法
package fourteen;
interface ConIn{ //构造方法接口
ConDemo action(int i);//调用无参方法
}
public class ConDemo { //测试类
public ConDemo() { //无参构造方法
System.out.println("无参构造方法");
}
public ConDemo(int i) { //有参构造方法
System.out.println("有参构造方法"+i);
}
public static void main(String[] args) {
ConIn ci1 = ConDemo::new;//引用ConIn类的构造方法
ConDemo b=ci1.action(5);//通过无参方法船舰对象
}
}
3.流处理
import java.util.ArrayList;
import java.util.List;
public class Employee { // 员工类
private String name; // 姓名
private int age; // 年龄
private double salary; // 工资
private String sex; // 性别
private String dept; // 部门
// 构造方法
public Employee(String name, int age, double salary, String sex, String dept) {
this.name = name;
this.age = age;
this.salary = salary;
this.sex = sex;
this.dept = dept;
}
// 重写此方法,方便打印输出员工信息
public String toString() {
return "name=" + name + ", age=" + age + ", salary=" + salary + ", sex=" + sex + ", dept=" + dept;
}
// 以下是员工属性的getter方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getSalary() {
return salary;
}
public String getSex() {
return sex;
}
public String getDept() {
return dept;
}
static List<Employee> getEmpList() { // 提供数据初始化方法
List<Employee> list = new ArrayList<Employee>();
// 添加员工数据
list.add(new Employee("老张", 40, 9000, "男", "运营部"));
list.add(new Employee("小刘", 24, 5000, "女", "开发部"));
list.add(new Employee("大刚", 32, 7500, "男", "销售部"));
list.add(new Employee("翠花", 28, 5500, "女", "销售部"));
list.add(new Employee("小马", 21, 3000, "男", "开发部"));
list.add(new Employee("老王", 35, 6000, "女", "人事部"));
list.add(new Employee("小王", 21, 3000, "女", "人事部"));
return list;
}
}
4.Stream接口
package fourteen;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamDemo {
public static void main(String[] args) {
List<Employee> list=Employee.getEmpList();//从employee表拿到list表中的员工表
Stream<Employee> stream = list.stream();//调用list方法将表转换成流
//筛选年龄>30岁的员工
stream=stream.filter(sx-> sx.getAge()>30);//写条件,sx属于临时变量
//限制条数
stream = stream.limit(2);
List<Employee> result = stream.collect(Collectors.toList());//转成List链表
for (Employee sx : result) {//for循环输出结果
System.out.println(sx);
}
}
}
5.数据分组
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class GroupDemo {
public static void main(String[] args) {
// 分组
List<Employee> list=Employee.getEmpList();//从employee表拿到list表中的员工表
Stream<Employee> stream = list.stream();//调用list方法将表转换成员工流
Map<String,List<Employee>> map = //创建map集合存入,String代指dept,list链表指代map集合的value
stream.collect(Collectors.groupingBy(Employee::getDept));//利用流调用collect方法,分组方法,传入方法
Set<String> depts = map.keySet();//获取map集合中的部门表
for(String dept:depts){//for循环一个部门,depts代指部门
System.out.println(dept+"员工信息如下:");//输出信息
List<Employee> temp = map.get(dept);//分组列表输出
for(Employee g : temp){//temp是临时变量
System.out.println(g);//
}
System.out.println();
}
}
}