Java8新特性
今天不是很忙,抽空看了学习一下lambda表达式,假如我们有一个需求:需要给一个学生的集合按照年龄排序.传统的实现如下:
Collections 是java.util包下的一个工具类,主要用来做一些集合的操作,大家有时间可以看一下,传统的实现要override Comparator接口下的compare方法.
java8的Lambda表达式可以简化掉实现部分的代码,如以上的需求,用lambda只要一行就好,代码如下:
Java8有很多新特性:
Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
Date Time API − 加强对日期与时间的处理。
Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
其中最核心的就是函数式编程和Stream流了,下面结合实例来看一下,还是刚才的学生类,我们加上几个属性:
下面是加上过滤条件,输出成绩在85分以上的学生:
这里出现了stream流的API,它包含了大量的封装好的接口供我们使用,掌握了stream流,基本就对lambda掌握了一半,下面来试一下用stream流进行分组操作,还是刚才的学生类,我们再加一个班级属性:
这里用Map用key代表A或B,value即使属于这两个班级的学生,那么Lambda中,List和Map之间的转换是怎么样的,如下:
如图,Map的key 就是学生名称,value则是一个学生的主体,刚才也看了List在Lambda下的过滤操作,接下来分别看一下根据map的key和value的过滤操作:
Optional是一个容许空对象的容器类,在这个容器中对象如果存在的话,就可以通过get()方法获取到,否则返回一个空的Optional对象:
进行到这里差不多了,下面搞一个lambda的集中训练的代码,基本常用的功能包含在里面:
package com.lambda.test;
import com.lambda.model.Employee;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
/**
* @program: study
* @description:
* @author: Elias.Guo
* @create: 2020-06-08 15:25
**/
public class LambdaTest4 {
public static List<Employee> generateData() {
return Arrays.asList(new Employee("Matt", 5000, "New York"),
new Employee("Steve", 6000, "London"),
new Employee("Carrie", 10000, "New York"),
new Employee("Peter", 7000, "New York"),
new Employee("Alec", 6000, "London"),
new Employee("Sarah", 8000, "London"),
new Employee("Rebecca", 4000, "New York"),
new Employee("Pat", 20000, "New York"),
new Employee("Tammy", 9000, "New York"),
new Employee("Fred", 15000, "Tokyo"));
}
public static Map<String, Integer> generateMapData() {
Map<String, Integer> items = new HashMap<>();
items.put("A", 10);
items.put("B", 20);
items.put("C", 30);
items.put("D", 40);
items.put("E", 50);
items.put("F", 60);
return items;
}
@Test
public void test1(){
//anyMatch
List<Employee> employeeList = generateData();
boolean isMatch = employeeList.stream().anyMatch(employee -> employee.getOffice().equals("London"));
System.out.println(isMatch);
//allMatch
boolean matched = employeeList.stream().allMatch(employee -> employee.getOffice().equals("London"));
System.out.println(matched);
//找出工资最高的
Optional<Employee> employeeOptional = employeeList.stream().max((e1, e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
System.out.println(employeeOptional);
//找出工资最少的
Optional<Employee> employee = employeeList.stream().min((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
System.out.println(employee);
//返回姓名列表
List<String> names = employeeList.stream().map(c->c.getName()).collect(Collectors.toList());
System.out.println(names);
System.out.println(">>>>>>>>>>>");
//List转化Map
Map<String,Employee> employeeMap = employeeList.stream().collect(Collectors.toMap((key->key.getName()),(value->value)));
employeeMap.forEach((key,value)-> System.out.println(key + "=" + value));
//统计办公室是New York的个数
long officeCount = employeeList.stream().filter(c->c.getOffice().equals("New York")).count();
System.out.println(officeCount);
long salaryCount = employeeList.stream().filter(c->c.getSalary()>60000).count();
System.out.println(salaryCount);
//List转化为Set
Set<String> officeSet = employeeList.stream().map(c->c.getOffice()).distinct().collect(Collectors.toSet());
System.out.println(officeSet);
Set<Integer> salarySet = employeeList.stream().map(c->c.getSalary()).distinct().collect(Collectors.toSet());
System.out.println(salarySet);
//查找办公室地点是New York的员工
Optional<Employee> optionals = employeeList.stream().filter(c->c.getOffice().equals("New York")).findAny();
System.out.println(optionals);
System.out.println(">>>>>工资降序排序>>>>>");
//按照工资的降序来列出员工信息
List<Employee> sortSalaryEmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).collect(Collectors.toList());
System.out.println(sortSalaryEmployeeList);
System.out.println(">>>>>姓名升序排序>>>>>");
List<Employee> sortNameEmployeeList = employeeList.stream().sorted((e1,e2)->e1.getName().compareTo(e2.getName())).collect(Collectors.toList());
System.out.println(sortNameEmployeeList);
System.out.println(">>>>获取工资最高的前2条员工信息");
List<Employee> dispaly2EmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).limit(2).collect(Collectors.toList());
System.out.println(dispaly2EmployeeList);
System.out.println(">>>>获取平均工资");
OptionalDouble averageSalary = employeeList.stream().mapToInt(c->c.getSalary()).average();
System.out.println(averageSalary);
System.out.println(">>>>获取工作地点的平均工资");
OptionalDouble optionalDouble = employeeList.stream().filter(c->c.getOffice().equals("New York")).mapToInt(c->c.getSalary()).average();
System.out.println(optionalDouble);
System.out.println(">>>>>>Java8 Optional用法>>>>>>");
Optional<String> stringOptional = Optional.of("test");
System.out.println(stringOptional.get());
Optional<String> isOptional = Optional.ofNullable("hello");
System.out.println(isOptional.isPresent());
System.out.println(isOptional.get());
System.out.println(isOptional.orElse("0"));
System.out.println(">>>>>>>>>>>>");
//Optional<String> optionalVal = Optional.of(null);
// System.out.println(optionalVal);
Optional<String> optional = Optional.ofNullable("optional");
System.out.println(optional);
System.out.println(optional.isPresent());
System.out.println(optional.get());
System.out.println(optional.orElse("haha"));
System.out.println(">>>>>>>>>>>>");
Optional<Employee> employeeOptional_ = employeeList.stream().filter(c->c.getOffice().equals("New York")).findFirst();
System.out.println(employeeOptional_);
}
}