函数式编程学习笔记

时间:2021-06-09 01:17:07

函数式编程包含三部分

1、流 -- 针对集合操作

1.1 流获取

单列集合获取流: Collection.stream() 
数组创建stream流:Array.stream()
map创建stream流: map->转为单列集合 entrySet/keySet/valueSet -> 生成流 .stream()

1.2 中间操作

filter -- 过滤
map -- 对元素进行计算或者转换 一转一
distinct -- 去重 需要注意要重写equals方法
sorted -- 无参 待比较类必须实现Comparable接口 有参 重写比较器逻辑
limit -- 获取流里指定个数的元素
skip -- 跳过流中的前n个元素
flatMap -- 将一个对象转换成多个对象作为流中的元素 (一般用来从对象中获取集合类型的元素列表并转换成流塞进新流里)

1.3 终结操作

forEach -- 遍历操作
count -- 流中元素个数
max/min - 最大最小
collect - 流转换为集合 list/set/map集合 -- Collectors工具类
anyMatch - 任意一个符合条件返回true
allMatch - 所有元素都满足条件 返回true
noneMatch - 都不符合 返回true
findAny - 获取流中满足条件的任意一个元素 返回Optional
findFirst - 获取流中满足条件的第一个元素 返回Optional
reduce - 通过计算将数据做汇总计算输出  reduce和map搭配使用 根据给定的初始值 再和流里面的每个元素进行计算 获取最后的输出值 最大值/最小值 或者求和 或者除法 或者乘法等

1.4 使用流操作注意事项

惰性求值 (没有终结操作,中间操作是不会得到执行的)
流是一次性的
流操作不会影响原始数据

2、函数式接口

2.1 Optional

ofNullAble -- 创建Optional对象 
orElseGet -- 安全获取Optional对象里面的值 没有值返回默认值
orElseThrow -- 数据不为空 则获取数据 否则抛出异常可以自定义异常
filter -- 过滤 没有符合条件的数据 返回新的空Optional
ifPresent -- 存在就消费数据 不存在不消费数据
isPresent -- 存在数据返回true 可以做他消费操作,不一定只是对Optional持有数据操作 也可以是其他逻辑
map -- 对数据进行转换

2.2 函数式接口粗略概论

接口只有一个抽象方法就为函数式接口
可以实例化  可以在程序其他地方调用 从面相对象编程 转换思维到面向方法编程

3、方法引用

使用场景 -- lambda表达式场景下 写法简化
哪些写法可以被简化 -- 只有一行代码 而且这一行代码只调用一个方法 就可以简化为方法引用(lambda表达式)
基本格式-- 类名或者对象名::方法名
静态方法 重写的抽象方法把静态方法的参数都按顺序传入静态方法 就可简化为方法引用 -- 类名::方法名

4、demo 

authors.stream()
                .distinct()
                .filter(author -> author.getAge() > 20)
                .forEach(System.out::println);
        Map<String, Author> name2Author = authors.stream().collect(Collectors.toMap(Author::getName, author -> author));
        System.out.println(name2Author);
        name2Author.entrySet()
                .stream()
                .filter(stringAuthorEntry -> Objects.equals("kola", stringAuthorEntry.getKey()))
                .forEach(stringAuthorEntry -> {
                    System.out.println(stringAuthorEntry.getKey());
        });
        authors.stream()
                .distinct()
                .sorted((o1, o2) -> o2.getAge() - o1.getAge())
                .forEach(author -> System.out.println(author.getAge()));

        authors.stream()
                .distinct()
                .sorted()
                .skip(1)
                .forEach(author -> System.out.println(author.getAddress() ));
        authors.stream()
                .flatMap((Function<Author, Stream<Book>>) author -> author.getBooks().stream())
                .distinct()
                .forEach(book -> System.out.println(book.getBookName()));
        authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .distinct()
                .flatMap(book -> Arrays.stream(book.getBookName().split(",")))
                .distinct()
                .forEach(bookName -> System.out.println(bookName));
		Optional<Integer> max = authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .map(book -> book.getTotalNum())
                .max(Comparator.comparingInt(num -> num));
        System.out.println(max.get());

        Optional<Integer> min = authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .map(book -> book.getTotalNum())
                .min(Comparator.comparingInt(num -> num));
        System.out.println(min.get());