函数式编程(Lambda表达式、Optional、Stream流)

函数式编程(Lambda表达式、Optional、Stream流)


一、概述

1. 为什么要学习函数式编程?

  • 大数量下处理集合效率高
  • 代码可读性高
  • 消灭嵌套地狱

嵌套地狱:

	// 查询未成年作家的评分在70以上的书籍,由于洋流影响所以作家和书籍可能出现重复,需要进行去重
    List<Book> bookList = new ArrayList<>();
    Set<Book> uniqueBookValues = new Hashset<>();
    Set<Author> uniqueAuthorValues = new HashSet<>(0);
    for (Author author : authors) {
        if (uniqueAuthorValues.add(author)) {
            if (author.getAge() < 18) {
                List<Book> books = author.getBooks();
                for (Book book : books) {
                    if (book.getScore() > 70) {
                        if (uniqueAuthorValues.add(book)) {
                            bookList.add(book);
                        }
                    }
                }
            }
        }
    }
    System.out.println(bookList);

改为函数式编程:

    List<Book> collect = authors.stream(
            .distinct()
            .filter(author -> author.getAge() < 18)
            .map(author -> author.getBooks())
            .flatMap(CoTTection::stream)
            .filter(book -> book.getscore() > 70)
            .distinct()
            .co11ect(Collectors.toList();)
    system.out.println(collect);

2. 函数式编程思想

面向对象思想需要关注用什么对象完成什么事情。而函数式编程思想就类似于我们数学中的函数。它主要关注的是对数据进行了什么操作。

优点:

  • 代码简洁、快速开发;
  • 接近自然语言,易于理解;
  • 易于并发编程;

二、Lambda表达式

概述:

Lambda 是JDK8 中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。

基本格式:

(参数列表)->{代码}

例子:我们在创建线程并启动时可以使用匿名内部类的写法:

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("任务代码");
        }
    }).start();

使用Lambda的格式对其进行修改后:

    new Thread( ()->{
        System.out.println("任务代码");
    }).start();

省略规则:

  • 参数类型可以省略;
  • 方法体内只有一句代码时大括号 return 和唯一一句代码的分号可以省略;
  • 方法只有一个参数时小括号可以省略;
  • 以上这些规则都记不住也可以省略不记;

三、Stream流

概述:

Java8 的 Stream 使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或数组进行链状流式的操作。可以更方便的让我们对集合或数组操作。

案例准备:

@Data
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class Author {
    // id
    private Long id;
    // 姓名
    private String name;
    // 年龄
    private Integer age;
    // 简介
    private String intro;
    // 作品
    private List<Book> books;
}
@Data
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    // id
    private Long id;
    // 书名
    private String name;
    // 分类
    private String category;
    // 评分
    private String score;
    // 简介
    private String intro;
}
public class TestStream {

    public static void main(String[] args) {

    }

    private static List<Author> getAuthors() {
        Author author1 = new Author(1l, "蒙多", 33, "一个从菜刀中明悟哲理的祖安人", null);
        Author author2 = new Author(2l, "呀拉索", 15, "疯狂也追逐不上他的思考速度", null);
        Author author3 = new Author(3l, "易", 33, "是这个世界在限制他的思维", null);
        Author author4 = new Author(4l, "易", 14, "一个从菜刀中明悟哲理的祖安人", null);

        // 书籍列表
        List<Book> books1 = new ArrayList<>();
        List<Book> books2 = new ArrayList<>();
        List<Book> books3 = new ArrayList<>();

        books1.add(new Book(1l, "刀的两侧是光明与黑暗", "哲学,爱情", 88, "用一把刀划分了爱恨"));
        books1.add(new Book(2l, "一个人不能死在同一把刀下", "个人成长,爱情", 99, "讲述如何从失败"));

        books2.add(new Book(3l, "那风吹不到的地方", "哲学", 85, "带你用思维去领略世界的尽头"));
        books2.add(new Book(3l, "那风吹不到的地方", "哲学", 85, "带你用思维去领略世界的尽头"));
        books2.add(new Book(4l, "吹或不吹", "爱情,个人传记", 85, "一个哲学家的恋爱观注定很难把"));

        books3.add(new Book(5l, "你的剑就是我的剑", "爱情,个人传记", 85, "一个哲学家的恋爱观注定很难把"));
        books3.add(new Book(6l, "风与剑", "个人传记", 100, "两个哲学家"));
        books3.add(new Book(6l, "风与剑", "个人传记", 100, "两个哲学家"));

        author1.setBooks(books1);
        author2.setBooks(books2);
        author3.setBooks(books3);

        ArrayList<Author> authors = new ArrayList<>(Arrays.asList(author1, author2, author3));
        return authors;
    }

}

你可能感兴趣的:(java,jvm,开发语言)