Java基础深化和提高 ---- 函数式编程 Lambda

news2024/11/29 12:45:37

Lambda表达式介绍

Lambda简介

 

 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内 部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作 中,可以极大地优化代码结构。

 在Java语言中,可以为变量赋予一个值:

 

 能否把一个代码块赋给一变量吗?

 

 在Java 8之前,这个是做不到的。但是Java 8问世之后,利用 Lambda特性,就可以做到了。

 甚至我们可以让语法变得更简洁

 在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表 达式本身,也就是”那段代码“,需要是这个接口的实现。这是我认 为理解Lambda的一个关键所在,简而言之就是,Lambda表达式本 身就是一个接口的实现。直接这样说可能还是有点让人困扰,我们 继续看看例子。我们给上面的aBlockOfCode加上一个类型:

 

 这种只有一个接口函数需要被实现的接口类型,我们叫它”函数式接 口“。为了避免后来的人在这个接口中增加接口函数导致其有多个接 口函数需要被实现,变成"非函数接口”,我们可以在这个上面加上 一个声明@FunctionalInterface, 这样别人就无法在里面添加新的接 口函数了。

 

 Lambda作用

最直观的作用就是使得代码变得异常简洁。

 接口要求

 虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不 是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接 口中只能有一个需要被实现的方法,不是规定接口中只能有一个方 法。 jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默 认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使 用。

@FunctionalInterface注解作用

@FunctionalInterface标记在接口上,“函数式接口”是指仅仅只包含 一个抽象方法的接口。

 Lambda表达式语法

 语法结构

(parameters) -> expression
或
(parameters) ->{ statements;}

语法形式为 () -> {}: () 用来描述参数列表,如果有多个参数,参数之间用逗号隔开,如 果没有参数,留空即可; -> 读作(goes to),为 lambda运算符 ,固定写法,代表指向动作; {} 代码块,具体要做的事情,也就是方法体内容;

Lambda表达式的重要特征

可选类型声明:不需要声明参数类型,编译器可以统一识别参数 值。 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定 义圆括号。 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自 动返回值,大括号需要指定明表达式返回了一个数值。 

 Lambda案例

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何
值(看起来像是返回void)  
(String s) -> System.out.print(s)

Lambda表达式入门案例

定义函数接口

/**
* 无返回值,无参数
*/
@FunctionalInterface
interface NoReturnNoParam{
    void method();
}
/**
* 无返回值,有一个参数
*/
@FunctionalInterface
interface NoReturnOneParam{
    void method(int a);
}
/**
* 无返回值,有多个参数
*/
@FunctionalInterface
interface NoReturnMultiParam{
    void method(int a,int b);
}
/**
* 有返回值,无参数
*/
@FunctionalInterface
interface ReturnNoParam{
    int method();
}
/**
* 有返回值,有一个参数
*/
@FunctionalInterface
interface ReturnOneParam{
    int method(int a);
}
/**
* 有返回值,有多个参数
*/
@FunctionalInterface
interface ReturnMultiParam{
    int method(int a,int b);
}

实现函数接口

public static void main(String[] args) {
    /**
     * 无返回值,无参数
     */
    NoReturnNoParam noReturnNoParam = ()->{
        System.out.println("NoReturnNoParam");
       };
        noReturnNoParam.method();
    /**
     * 无返回值,有一个参数
     */
    NoReturnOneParam noReturnOneParam = (int a)->{
        System.out.println("NoReturnOneParam"+a);
   };
     noReturnOneParam.method(10);
    /**
     * 无返回值,有多个参数
     */
    NoReturnMultiParam noReturnMultiParam = (int a, int b)->{
        System.out.println("NoReturnMultiParam "+a+"\t"+b);
   };
    noReturnMultiParam.method(10,20);
    /**
     * 有返回值,无参数
     */
    ReturnNoParam returnNoParam = ()->{
        System.out.print("ReturnNoParam ");
        return 10;
   };
    System.out.println(returnNoParam.method());
   /**
     * 有返回值,有一个参数
     */
    ReturnOneParam returnOneParam = (int a)->{
        System.out.print("ReturnOneParam ");
        return a;
   };
  
System.out.println(returnOneParam.method(10));
    /**
     * 有返回值,有多个参数
     */
    ReturnMultiParam returnMultiParam = (int a ,int b)->{
        System.out.print("ReturnMultiParam ");
        return a+b;
   };
  
System.out.println(returnMultiParam.method(10, 20));
}

Lambda语法简化

/**
     * 无返回值,无参数
     */
   /* NoReturnNoParam noReturnNoParam = ()->{ System.out.println("NoReturnNoParam");
    };*/
    /**
     * 简化版
     */
    NoReturnNoParam noReturnNoParam = ()-> System.out.println("NoReturnNoParam");
    noReturnNoParam.method();
    /**
     * 无返回值,有一个参数
     */
   /* NoReturnOneParam noReturnOneParam = (int a)->{
        System.out.println("NoReturnOneParam "+a);
    };*/
    /**
     * 简化版
     */
    NoReturnOneParam noReturnOneParam = a -> System.out.println("NoReturnOneParam "+a);
     noReturnOneParam.method(10);
    /**
     * 无返回值,有多个参数
     */
   /* NoReturnMultiParam noReturnMultiParam = (int a, int b)->{
        System.out.println("NoReturnMultiParam "+a+"\t"+b);
    };*/

    NoReturnMultiParam noReturnMultiParam = (a,b)-> System.out.println("NoReturnMultiParam "+a+"\t"+b);
    noReturnMultiParam.method(10,20);
    /**
     * 有返回值,无参数
     */
     /* ReturnNoParam returnNoParam = ()->{
        System.out.print("ReturnNoParam ");
        return 10;
    };*/
    /**
     * 简化版
     */
    ReturnNoParam returnNoParam = ()->10+20;
    System.out.println(returnNoParam.method());
    /**
     * 有返回值,有一个参数
     */
  /* ReturnOneParam returnOneParam = (int a)->
      {
        System.out.print("ReturnOneParam ");
        return a;
    };*/
    /***
     * 简化版
     */
    ReturnOneParam returnOneParam = a->a;
  System.out.println(returnOneParam.method(10));

    /**
     * 有返回值,有多个参数
     */
    /*ReturnMultiParam returnMultiParam = (int a ,int b)->{
        System.out.print("ReturnMultiParam ");
        return a+b;
    };*/
    /**
     * 简化版
     */
    ReturnMultiParam returnMultiParam = (a ,b)- >a+b;
    System.out.println(returnMultiParam.method(10, 20));
}


Lambda表达式的使用

Lambda表达式引用方法

有时候我们不是必须使用Lambda的函数体定义实现,我们可以利 用 lambda表达式指向一个已经存在的方法作为抽象方法的实现。

 要求

   1、参数的个数以及类型需要与函数接口中的抽象方法一致。

   2、返回值类型要与函数接口中的抽象方法的返回值类型一致。

语法 

      方法归属者::方法名 静态方法的归属者为类名,非静态方法归属者 为该对象的引用。

案例

/**
* 无返回值,无参数
*/
@FunctionalInterface
interface NoReturnNoParam{
    void method();
}
/**
* 无返回值,有一个参数
*/
@FunctionalInterface
interface NoReturnOneParam{
    void method(int a);
}
/**
* 无返回值,有多个参数
*/
@FunctionalInterface
interface NoReturnMultiParam{
    void method(int a,int b);
}
/**
* 有返回值,无参数
*/
@FunctionalInterface
interface ReturnNoParam{
    int method();
}
/**
* 有返回值,有一个参数
*/
@FunctionalInterface
interface ReturnOneParam{
    int method(int a);
}
/**
* 有返回值,有多个参数
*/
@FunctionalInterface
interface ReturnMultiParam{
    int method(int a,int b);
}





public class Test {
    public static void main(String[] args) {
        /**
         * 无返回值,无参数
         */
       /* NoReturnNoParam noReturnNoParam = ()->{
          System.out.println("NoReturnNoParam");};*/
        /**
         * 简化版
         */
        NoReturnNoParam noReturnNoParam = ()-> System.out.println("NoReturnNoParam");
        noReturnNoParam.method();
        /**
         * 无返回值,有一个参数
         */
       /* NoReturnOneParam noReturnOneParam =(int a)->{
          System.out.println("NoReturnOneParam "+a);
        };*/
        /**
         * 简化版
         */
        NoReturnOneParam noReturnOneParam = a -> System.out.println("NoReturnOneParam"+a);
         noReturnOneParam.method(10);
        /**
         * 无返回值,有多个参数
         */
       /* NoReturnMultiParam noReturnMultiParam = (int a, int b)->{
          System.out.println("NoReturnMultiParam"+a+"\t"+b);
        };*/
          NoReturnMultiParam noReturnMultiParam = (a,b)-> System.out.println("NoReturnMultiParam"+a+"\t"+b);
        noReturnMultiParam.method(10,20);
        /**
         * 有返回值,无参数
         */
       /* ReturnNoParam returnNoParam = ()->{
            System.out.print("ReturnNoParam ");
            return 10;
        };*/
        /**
         * 简化版
         */
        ReturnNoParam returnNoParam = ()->10+20;
      System.out.println(returnNoParam.method());
        /**
         * 有返回值,有一个参数
         */
      /* ReturnOneParam returnOneParam = (inta)->{
            System.out.print("ReturnOneParam");
            return a;
        };*/
        /***
         * 简化版
         */
         ReturnOneParam returnOneParam = a->a;
         System.out.println(returnOneParam.method(10));
        /**
         * 有返回值,有多个参数
         */
        /*ReturnMultiParam returnMultiParam = (int a ,int b)->{
            System.out.print("ReturnMultiParam");
            return a+b;
        };*/
        /**
         * 简化版
         */
        ReturnMultiParam returnMultiParam = (a,b)->a+b;
      System.out.println(returnMultiParam.method(10,20));
   }
    /**
     * 要求:
     * 1,参数的个数以及类型需要与函数接口中的抽象方法一致。
     * 2,返回值类型要与函数接口中的抽象方法的返回值类型一致。
     * @param a
     * @return
     */
public static int doubleNum(int a){
        return 2*a;
   }
    public int addTwo(int a){
        return a+2;
   }
}

public class Test2 {
    public static void main(String[] args) {
        ReturnOneParam returnOneParam =Test::doubleNum;
        int value = returnOneParam.method(10);
        System.out.println(value);
        Test test = new Test();
        ReturnOneParam returnOneParam1 = test::addTwo;
        int value2 = returnOneParam1.method(10);
        System.out.println(value2);
   }
}

Lambda表达式创建线程

public class Test3 {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName()+" 开始");
        new Thread(()->{
            for(int i=0;i<20;i++){
                try {
                    Thread.sleep(500);
               } catch (InterruptedExceptione) {
                    e.printStackTrace();
               }
              System.out.println(Thread.currentThread().getName()+" "+i);
           }
       },"Lambda Thread ").start();
      System.out.println(Thread.currentThread().getName()+" 结束");
   }
}

Lambda 表达式中的闭包问题

什么是闭包

闭包的本质就是代码片断。所以闭包可以理解成一个代码片断的引 用。在Java中匿名内部类也是闭包的一种实现方式。 在闭包中访问外部的变量时,外部变量必须是final类型,虚拟机会 帮我们加上 final 修饰关键字。

public class Test4 {
    public static void main(String[] args) {
        final int num  =10;
        NoReturnNoParam noReturnNoParam = ()- >System.out.println(num);
        noReturnNoParam.method();
   }
}

常用的函数接口

Consumer接口的使用

Consumer 接口是JDK为我们提供的一个函数式接口,该接口也被 称为消费型接口。

 遍历集合

我们可以调用集合的 public void forEach(Consumer action) 方法,通过 lambda 表达式的方式遍历集合中的元素。以下 是 Consumer 接口的方法以及遍历集合的操作。

public class Test4 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.forEach(System.out::println);
   }
}

Predicate接口的使用

Predicate 是 JDK 为我们提供的一个函数式接口,可以简化程序的编写。

 删除集合中的元素

我们通过public boolean removeIf(Predicate filter)方 法来删除集合中的某个元素,

public class Test5 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.removeIf(ele->ele.equals("b"));
        list.forEach(System.out::println);
   }
}

Comparator接口的使用

Comparator是 JDK 为我们提供的一个函数式接口,该接口为比较 器接口。

元素排序

之前我们若要为集合内的元素排序,就必须调用 sort 方法,传入比 较器重写 compare 方法的比较器对象,现在我们还可以使用 lambda 表达式来简化代码。

public class Test7 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("d");
        list.add("b");
        list.add("c");
        list.sort((o1,o2)->o1.compareTo(o2));
        list.forEach(System.out::println);
   }
}

 Stream流介绍

Stream流简介

Stream是数据渠道,用于操作数据源所生成的元素序列,它可以实 现对集合的复杂操作,例如过滤、排序和映射等。Stream不会改变 源对象,而是返回一个新的结果集。

 Stream流的生成方式

生成流:通过数据源(集合、数组等)创建一个流。

中间操作:一个流后面可以跟随零个或者多个中间操作,其目的主要是打开流,做出某种程度的数 据过滤/映射,然后返回一个新的流,交给下一个操作使用。

终结操作:一旦执行终止操作,就执行中间的链式操作,并产生结果。

Stream流的常见方法 

数据过滤

public class Test8 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("oldlu");
        list.add("oldlin");
        list.add("kevin");
        list.add("peter");
        //多条件and关系
        list.stream().filter(ele -> ele.startsWith("o")).filter(ele-
>ele.endsWith("n")).collect(Collectors.toList()).forEach(System.out::println);
        System.out.println("------------------------");
        //多条件or关系
        Predicate<String> predicate1 = ele ->ele.startsWith("o");
        Predicate<String> predicate2 = ele->ele.endsWith("n");
        list.stream().filter(predicate1.or(predicate2)
).collect(Collectors.toList()).forEach(System.out::println);
   }
}

数量限制

public class Test9 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("oldlu");
        list.add("oldlin");
        list.add("kevin");
        list.add("peter");
        //limit
      list.stream().limit(2).forEach(System.out::println);
   }
}

元素排序

public class Test10 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("b");
        list.add("c");
        list.add("a");
        list.add("d");
        //升序排序
      list.stream().sorted(Comparator.naturalOrder()).forEach(System.out::println);
        System.out.println("---------------");
        //降序排序
      list.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);
   }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络-传输层(TCP可靠传输(校验,序号,确认,重传),TCP流量控制,TCP拥塞控制(慢开始,拥塞避免)(快重传,快恢复))

文章目录1. TCP可靠传输2. TCP流量控制3. TCP拥塞控制1. TCP可靠传输 网络层&#xff1a;提供尽最大努力交付&#xff0c;不可靠传输。 传输层&#xff1a;使用TCP实现可靠传输 可靠&#xff1a;保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。 TCP可…

redis 哨兵

哨兵可以帮助我们解决主从架构中的单点故障问题 哨兵的配置&#xff1a; 新建目录&#xff1a;usr/local/docker/redis/sen/ docker-compose.yml文件如下 version: "3.1" services:redis1:image: daocloud.io/library/redis:5.0.7restart: alwayscontainer_name: …

STL技巧大赏

STL技巧大赏 map insertinsertinsert 不允许有重复的键值的&#xff0c;如果新插入的键值与原有的键值重复则插入无效beginbeginbeginendendendclearclearclear 清除所有countcountcount 某个元素出现次数lower/upperboundlower/upper boundlower/upperbound set 比 mapmapm…

半导体新能源智能装备上位机工业软件设计方案

一、什么是上位机软件 如果说PLC是工业控制的小脑&#xff0c;那么上位机软件就是其大脑。在概念上&#xff0c;控制者和提供服务者是上位机&#xff0c;被控制者和被服务者是下位机&#xff0c;上位机往往是数字信号的处理和命令的下发&#xff0c;下位机往往是模拟量的处理和…

【Linux】初识系统调用进程状态

文章目录1. 什么是系统调用1.1 通过系统调用获取进程标示符通过其他方式查看PIDTopPS使用PID1.2 通过系统调用创建进程-fork初识2. 进程状态看看Linux内核源代码怎么定义查看状态Z(zombie)-僵尸进程僵尸进程危害孤儿进程1. 什么是系统调用 在linux中&#xff0c;系统调用是指操…

[附源码]java毕业设计校园志愿者服务管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Node_exporter主机探针部署

部署需求分析 使用ansible批量部署node-exporter监控客户端 node-exporter解压安装目录为home 添加至Linux服务重新加载&#xff0c;启动模块并设置开机启动 测试环境&#xff08;centos 7——3.10.0-1160.el7.x86_64&#xff09;运行成功 因为部署步骤较少&#xff0c;单个pla…

主从延迟读写不一致解决方案分析

具体业务场景方案分析 问题背景&#xff1a; 虽然强制走写库&#xff0c;避免了主从延迟带来的读库数据不一致问题&#xff0c;但是增加了写库的QPS&#xff0c;带来了巨大压力&#xff0c;所以通过限流来保护db&#xff0c;但这样会降低QPS。 业务上暂时不清楚&#xff0c;所…

[附源码]java毕业设计校园新闻管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

转铁蛋白修饰脂质体定制,Transferrin-Liposome

人转铁蛋白&#xff08;Human Transferrin&#xff09;主要在肝脏合成&#xff0c;是由位于同源N-端和C-端的两个叶片&#xff08;Lobe&#xff09;组成的一种单链糖蛋白。人转铁蛋白共含678个氨基酸残基&#xff0c;等电点为5.9、分子量为76kD。每分子的转铁蛋白能携带2个三价…

Mybatsi从入门到精通、从精通到卸载,这一篇就足够了【中篇】

资料下载 链接: https://pan.baidu.com/s/1i_D3hSkMElUyxBC0OJqRRg?pwdthg4提取码: thg4 简介 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简…

深度学习入门(四十七)计算机视觉——SSD和YOLO简介

深度学习入门&#xff08;四十七&#xff09;计算机视觉——SSD和YOLO简介前言计算机视觉——SSD和YOLO简介课件&#xff08;单发多框检测SSD&#xff09;生成锚框SSD模型效果总结课件&#xff08;YOLO&#xff09;YOLO&#xff08;你只看一次&#xff09;效果前言 核心内容来…

nvm的下载,安装与使用详解

一、安装nodejs方式有很多种 第一种&#xff1a;官网下载  通过nodejs官网下载安装 &#xff0c;但有个缺陷&#xff0c;不同版本的nodejs无法顺利的切换。 第二种: NVM安装  NVM可以帮助我们快速切换 node版本。 二、 下载nvm安装包 官方下载地址&#xff1a;http://​ h…

力扣(LeetCode)41. 缺失的第一个正数(C++)

类计数排序 小于 111 &#xff0c;大于 nnn 的数&#xff0c;不会对答案造成影响。所以只要考虑 1——n1——n1——n 的数。 由于题目要求 O(1)O(1)O(1) 空间&#xff0c;参考计数排序思想&#xff0c;利用原数组 numsnumsnums 存储 1——n1——n1——n &#xff0c;需要将 1…

网易有道三季报解读:转型“有道”,但依旧道阻且长

11月17日晚间&#xff0c;美股上市公司网易有道&#xff08;以下简称“有道”&#xff09;发布2022年第三季度财报&#xff0c;营收同比大幅增长&#xff0c;亏损大幅收窄&#xff0c;成绩喜人。有道去年三季度自7月24日“双减”政策出台后被迫开始转型&#xff0c;整整一年过去…

MySQL-Day02 数据库以及数据表的基本操作

目录 一、数据库的基本操作 1.1 创建数据库 1.2 删除数据库 1.3 使用创建的数据库 1.4 扩展知识&#xff1a;InnoDB表 面试题&#xff1a;InnoDB和MyISAM的区别&#xff1f; 二、数据表的基本操作 2.1 创建数据表 MySQL数据类型 2.2 表约束 2.2.1 主键约束 2.2.2 非…

求求了!这份GitHub 70K+的纯手写RabbitMQ 笔记都给我码住好吗!

说到消息中间件&#xff0c;大部分人的第一印象可能是Kafka。毕竟Kafka自问世以来&#xff0c;就顶着高并发&#xff0c;大流量的光环。当然了Kafka也不负众望&#xff0c;在大数据处理方面一直独领风骚。 这里想说说另一款同样优秀的消息中间件RabbitMQ。 选RabbitMQ还是Kaf…

一种多源信息融合方法及其应用(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

基于armv8的kvm实现分析(三)kvm初始化流程

本文基于以下软硬件假定&#xff1a; 架构&#xff1a;AARCH64 内核版本&#xff1a;5.14.0-rc5 1 kvm概述 kvm是基于linux内核实现的一种type 2虚拟化方案&#xff0c;它作为内核的一个模块负责虚拟化环境初始化&#xff0c;虚拟机和虚拟cpu模拟&#xff0c;以及IO捕获与转…

发布适用于 .NET 7 的 .NET MAUI

我们在六个月前向您介绍了 .NET 多平台应用程序 UI (MAUI)&#xff0c;现在我们很高兴地宣布 .NET MAUI 在我们的下一个主要版本 .NET 7 中普遍可用。在此短的时间范围内&#xff0c;我们在 .NET MAUI 中的主要工作是解决您的主要反馈报告、改进 CollectionView 的性能&#xf…