jdk1.8引入了Lombda表达式,函数式编程,帮我大大减少了代码的重复性,和代码的复杂度,更优雅的处理我们代码和方法,也能帮我业务数据做处理。
函数接口指仅具有单个抽象方法的接口,用来表示 Lambda 表达式的类型。
是惰性求值还是及早求值很简单:只需看它的返回值。如果返回值是 Stream, 那么是惰性求值;如果返回值是另一个值或为空,那么就是及早求值。
- package com.example.java8.employees;
-
- import java.util.List;
- import java.util.Objects;
-
- /**
- * 使用建造者模式创建对象:
- * 1,对象在赋值过后进行bulider创建对象
- *2,多线程里面对象他是线程安全,类this指向
- * @author xpwi
- * @since 2022-08-14
- */
- public class EmployeesVO {
-
- /**
- * id 编号
- */
- private int id;
-
- /**
- * 姓名
- */
- private String name;
- /**
- * 性别
- */
- private Integer gender;
-
- /**
- * 年龄
- */
- private Integer age;
-
- /**
- * 信息
- */
- private String msg;
-
-
- private List
result; -
- public EmployeesVO(Bulider bulider){
- this.id = bulider.id;
- this.name = bulider.name;
- this.age = bulider.age;
- this.gender = bulider.gender;
- this.msg = bulider.msg;
- this.result=bulider.result;
-
- }
-
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getGender() {
- return gender;
- }
-
- public void setGender(Integer gender) {
- this.gender = gender;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- public String getMsg() {
- return msg;
- }
-
- public void setMsg(String msg) {
- this.msg = msg;
- }
-
- public List
getResult() { - return result;
- }
-
- public void setResult(List
result) { - this.result = result;
- }
-
- /**
- * 工厂
- *
- */
- public static class Bulider{
- /**
- * id 编号
- */
- private int id;
-
- /**
- * 姓名
- */
- private String name;
- /**
- * 性别
- */
- private Integer gender;
-
- /**
- * 年龄
- */
- private Integer age;
-
- /**
- * 信息
- */
- private String msg;
-
-
- private List
result; -
- public Bulider(int id, String name, Integer gender, Integer age, String msg,List
result) { - this.id = id;
- this.name = name;
- this.gender = gender;
- this.age = age;
- this.msg = msg;
- this.result = result;
- }
-
- public Bulider id(int id){
- this.id=id;
- return this;
- }
- public Bulider name(String name){
- this.name=name;
- return this;
- }
- public Bulider name(Integer gender){
- this.gender=gender;
- return this;
- }
- public Bulider age(Integer age){
- this.age=gender;
- return this;
- }
- public Bulider age(String msg){
- this.msg=msg;
- return this;
- }
- public Bulider result(List
result) { - this.result=result;
- return this;
- }
- /**
- * this指向赋值this
- * @return
- */
- public EmployeesVO bulider(){
- return new EmployeesVO(this);
- }
-
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- EmployeesVO that = (EmployeesVO) o;
- return id == that.id &&
- Objects.equals(name, that.name) &&
- Objects.equals(gender, that.gender) &&
- Objects.equals(age, that.age) &&
- Objects.equals(msg, that.msg) &&
- Objects.equals(result, that.result);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(id, name, gender, age, msg, result);
- }
- }
测试类:
- package com.example.java8.employees;
-
- import java.util.*;
- import java.util.stream.Collectors;
-
- /**
- *
- *
- * @author xpwi
- * @since 2022-08-14
- */
- public class TestJava8 {
-
- public static List
oldList = new ArrayList<>(); - public static List
newList = new ArrayList<>(); -
- static {
- initData();
- }
-
- /**
- * 初始化数据
- */
- public static void initData() {
- List
result= new ArrayList<>(); - result.add("1d");
- result.add("25");
- result.add("3d");
- List
result2= new ArrayList<>(); - result2.add("4d");
- result2.add("55");
- result2.add("6d");
- EmployeesVO employeesVO1 = null;
- employeesVO1 = new EmployeesVO.Bulider(1, "王二", 0, 25, "test1",result).bulider();
- oldList.add(employeesVO1);
- employeesVO1 = new EmployeesVO.Bulider(1, "王二", 0, 25, "test1",result).bulider();
- oldList.add(employeesVO1);
- employeesVO1= new EmployeesVO.Bulider(1, "王二", 1, 25, "test1",result).bulider();
- oldList.add(employeesVO1);
- employeesVO1 = new EmployeesVO.Bulider(4, "李慧", 1, 20, "test 4",result2).bulider();
- oldList.add(employeesVO1);
- employeesVO1 = new EmployeesVO.Bulider(5, "王二三", 0, 25, "test 5",result2).bulider();
- oldList.add(employeesVO1);
-
-
- List
result4= new ArrayList<>(); - result2.add("1f");
- result2.add("e5");
-
- result2.add("1h");
- EmployeesVO employeesVO6 = new EmployeesVO.Bulider(6, "王二", 0, 25, "test 6",result2).bulider();
- EmployeesVO employeesVO7 = new EmployeesVO.Bulider(7, "李二", 0, 25, "test 7",result4).bulider();
- EmployeesVO employeesVO8 = new EmployeesVO.Bulider(8, "杨慧", 1, 23, "test 8",result4).bulider();
- EmployeesVO employeesVO9 = new EmployeesVO.Bulider(9, "周慧", 1, 20, "test 8",result4).bulider();
- EmployeesVO employeesVO10 = new EmployeesVO.Bulider(10, "周二", 0, 25, "test 10",result4).bulider();
-
- newList.add(employeesVO6);
- newList.add(employeesVO7);
- newList.add(employeesVO8);
- newList.add(employeesVO9);
- newList.add(employeesVO10);
- }
-
- /**
- * java常用函数:
- * 1,filter 代码的if操作,过滤数据
- * 2,map
- * 3,flatMap
- * 4,collect
- * 5,peek 调试 ,idea工具
- * 6,noneMatch,anyMatch
- * 7,skip
- * 8,distinct
- * 9,收集器 分组,sql group by
- * 分组,过滤,求和,平均,多个流合并,集合并集,交集,差集,map,集合转换
- *
- * @param args
- */
- public static void main(String args[]) {
- //filter 操作
- List
result1 = oldList.stream().filter(employeesVO -> employeesVO.getName().equals("王二三")).collect(Collectors.toList()); - //集合差集 根据前面的对象来的
- List
result2 = oldList.stream().filter(item-> !newList.stream().map( - employees -> employees.getName()
- ).collect(Collectors.toList()).contains(item.getName())).collect(Collectors.toList());
- //俩个对象相同的交集
- List
result3 = oldList.stream().filter(item->newList.stream().anyMatch( - employeesVO -> Objects.equals(item.getName(),employeesVO.getName()))
- ).peek(employeesVO -> employeesVO.getGender()).collect(Collectors.toList());
- //去重
- List
result4 = newList.stream().collect( - Collectors.collectingAndThen(Collectors.toCollection(
- ()->new TreeSet<>(Comparator.comparing(o->o.getName()+":"+o.getId()))
- ),ArrayList::new));
- //分页
- // newList.stream().skip((i-1)*size).limit(size).collect(Collectors.toList());
-
- //flatmap 合并流
- List
result5 = oldList.stream().map(m->m.getResult()).flatMap(Collection::stream).collect(Collectors.toList()); -
- //gropuby 分组
- Map
> result6 = newList.stream().map(item->item).collect(Collectors.groupingBy(employeesVO -> employeesVO.getGender())); -
- //收集器
- Map
> result7 = newList.stream().collect(Collectors.partitioningBy(employeesVO -> employeesVO.getGender()==0)); - //distinct 去重 重写equeas 和hash方法
- List
result8 = oldList.stream().distinct().collect(Collectors.toList()); - //map集合
- EmployeesVO employeesVO = new EmployeesVO.Bulider(6, "缓存", 0, 25, "缓存",null).bulider();
-
- cache.put("缓存",employeesVO);
- TestJava8 testJava8 = new TestJava8();
- EmployeesVO employeesVO1 =testJava8.getEmpCache("缓存222");
-
- EmployeesVO employeesVO3 =testJava8.getEmpCache("缓存222");
- System.out.println(result2);
- }
-
- public static Map
cache = new HashMap<>(); -
- public EmployeesVO employeesVO(String name){
- EmployeesVO employeesVO = new EmployeesVO.Bulider(6, "缓存", 0, 25, "缓存",null).bulider();
- return employeesVO;
- }
-
- public EmployeesVO getEmpCache(String name){
- return cache.computeIfAbsent(name,this::employeesVO);
- }
-
- }
相对循环里面的if
List beginningWithNumbers = new ArrayList<>();
for(String value : asList("a", "1abc", "abc1")) {
if (isDigit(value.charAt(0))) {
beginningWithNumbers.add(value);
}
}
assertEquals(asList("1abc"), beginningWithNumbers);
一个对象的集合合并为一个对象
List
list.stream().skip((i - 1) * sheetSize).limit(sheetSize). collect(Collectors.toList());
List
List
List
List
employees -> employees.getName()
).collect(Collectors.toList()).contains(item.getName())).collect(Collectors.toList());
result2.stream().filter(m->m.getVehicleNo().equals(parms.get(0))).collect(Collectors.toList());
newList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
()-> new TreeSet<>(Comparator.comparing(o -> o.getName()+":"+o.getId()))
), ArrayIter::new));
List
List
Map
groupingBy 收集器
SQL 中的 group by 操作
Map
static Map
public Employees getAuthCenterVo(String unionId){
Employees newEmployees = new Employees();
newEmployees.setId(1222);
newEmployees.setName("22222");
newEmployees.setAge(2222);
newEmployees.setGender(2222);
return newEmployees;
}
public Employees getlist(String name) {
return artistCache.computeIfAbsent(name, this::getAuthCenterVo);
}
记录日志这是 peek 方法的用途之一。为了像调试循环那样一步一步跟踪,可在 peek 方法 中加入断点,这样就能逐个调试流中的元素了。 此时,peek 方法可知包含一个空的方法体,只要能设置断点就行。有一些调试器不允许在 空的方法体中设置断点,此时,我将值简单地映射为其本身,这样就有地方设置断点了, 虽然这样做不够完美,但只要能工作就行
示列1:
List
m->System.out.println(m)
).collect(
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(
Comparator.comparing(
o->o.getName()+":"+o.getGender()))
),ArrayList::new ));
示列2:
long wordsList = Arrays.stream(test22.split(",")).map(m->m ).peek( t->System.out.println(t)).filter(textContent::equals)
.count();

常用的java8函数表达式就基本差不多这么多了,如果你需要了解其他的高阶的函数,可以去用@FuctionInterface注解操作