Java进阶之旅第七天

2024-01-24

Java进阶之旅第七天

方法引用

介绍

  • 把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体
  • 满足条件
    • 1.引用处必须是函数式接口
    • 2.被引用的方法必须已经存在
    • 3.被引用方法的形参和返回值需要跟抽象方法保持一致
    • 4.被引用方法的功能要满足当前需求
  • 方法引用符: ‘::’
  • 引用方法需要使用类调用方法

代码展示

        //简单演示(将数组逆序排序
        Integer[] arr = {1,2,3,4,5,6,7,8};

//        1.引用处必须是函数式接口(Arrays.sort的第二个参数)
//        2.被引用的方法必须已经存在(存在compareTo
//        3.被引用方法的形参和返回值需要跟抽象方法保持一致
//        4.被引用方法的功能要满足当前需求
        Arrays.sort(arr,Main::compareTo);

        System.out.println(Arrays.toString(arr));
    }

    public static int compareTo(int a,int b){
        return b-a;
    }

结果

[8, 7, 6, 5, 4, 3, 2, 1]

方法引用的分类

引用静态方法

格式
  • 类名::静态方法
  • 例子: Integer::parseInt
代码
//        1.引用处必须是函数式接口(Arrays.sort的第二个参数)
//        2.被引用的方法必须已经存在(存在compareTo
//        3.被引用方法的形参和返回值需要跟抽象方法保持一致
//        4.被引用方法的功能要满足当前需求
        ArrayList<String> arr = new ArrayList<>();
        Collections.addAll(arr,"1","2","3");
        //将字符串转化成Int类型
        //利用上一天学习过的stream流,中的map(类型转换,具有函数式接口
        //将字符串转化成Int类型,利用Integer类中的parseInt方法,并且用静态方法引用
        Integer[] newarr = arr.stream().map(Integer::parseInt).toArray(value -> new Integer[value]);
        System.out.println(Arrays.toString(newarr));
结果
[1, 2, 3]

引用成员方法

格式
  • 对象::成员方法
  • 细节:
    • 其他类: 其他类对象::方法名
    • 本类: this::方法名 (引用处不能是静态的,原因: 静态不存在this)
    • 父类: super::方法名 (引用处不能是静态的)
代码:
//        1.引用处必须是函数式接口
//        2.被引用的方法必须已经存在
//        3.被引用方法的形参和返回值需要跟抽象方法保持一致
//        4.被引用方法的功能要满足当前需求
        ArrayList<String> arr = new ArrayList<>();
        Collections.addAll(arr,"小明","校长","小红");

        //要求: 筛选姓"小",且名字长度为2的字符串

        //以前的写法
        /*arr.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("小")&&s.length()==2;
            }
        }).forEach(s-> System.out.println(s));*/

        //成员方法引用
        /*
        * stringJudge类存在judge方法
        * */
        arr.stream().filter(new stringJudge()::judge).forEach(System.out::println);

        ///stringJudge类的代码
        public boolean judge(String s){
            return s.startsWith("小")&&s.length()==2;
        }
结果
小明
小红

引用构造方法

格式/目的
  • 格式: 类名::new
  • 例子: Student::new
  • 目的: 创建对象
代码:
//        1.引用处必须是函数式接口
//        2.被引用的方法必须已经存在
//        3.被引用方法的形参和返回值需要跟抽象方法保持一致
//        4.被引用方法的功能要满足当前需求

        ArrayList<String> arr = new ArrayList<>();
        Collections.addAll(arr,"小明-15","校长-50","小红-16");

        /*目的
        * 将集合中的名字和年龄封装到People对象并收集到List集合中
        * */
        //不使用lambda简化的操作
        /*List<People> Parr = arr.stream().map(new Function<String, People>() {
            @Override
            public People apply(String s) {
                String name = s.split("-")[0];
                int age = Integer.parseInt(s.split("-")[1]);
                return new People(name, age);
            }
        }).toList();
        System.out.println(Parr);*/

        //使用引用构造函数
        List<People> Parr = arr.stream().map(People::new).toList();
        System.out.println(Parr);
        
        ///People中的关键构造方法
        //在People类中添加的构造函数
       //不需要返回值
        public People(String s) {
            this.name = s.split("-")[0];
            this.age = Integer.parseInt(s.split("-")[1]);
        }
结果:
[People{name = 小明, age = 15}, People{name = 校长, age = 50}, People{name = 小红, age = 16}]

使用类名引用成员方法

格式
  • 类名::成员方法
  • 例子: String::substring
独有规则
  • 方法引用的规则:
  • 1.需要有函数式接口
  • 2.被引用的方法必须已经存在
  • 3.被引用方法的形参, 需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致
  • 4.被引用方法的功能需要满足当前的需求
  • 抽象方法形参的详解:
    • 第一个参数: 表示被引用方法的调用者,决定了可以引用哪些类中的方法 ,在Stream流当中,第一个参数一般都表示流里面的每一个数据。假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法
    • 第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法
代码
        ArrayList<String> arr = new ArrayList<>();
        Collections.addAll(arr,"a","b","c");
        //转大写
        arr.stream().map(String::toUpperCase).forEach(System.out::println);

结果
A
B
C

引用数组的构造方法

格式
  • 数据类型[]::new
  • 例子: int[]::new
  • 创建数组的类型需要和元素的类型保持一致
代码
        ArrayList<Integer> arr = new ArrayList<>();
        Collections.addAll(arr,1,2,3,4);
        //集合数据转到数组中
        
        /*Integer[] array = arr.stream().toArray(new IntFunction<Integer[]>() {
            @Override
            public Integer[] apply(int value) {
                return new Integer[value];
            }
        });*/
        
        Integer[] array = arr.stream().toArray(Integer[]::new);
        System.out.println(Arrays.toString(array));
结果
[1, 2, 3, 4]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java进阶之旅第七天 的相关文章

  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 无法导入 langchain.agents.load_tools

    我正在尝试使用 LangChain Agents 但无法导入 load tools 版本 langchain 0 0 27 我尝试过这些 from langchain agents import initialize agent from
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • Spider 必须返回 Request、BaseItem、dict 或 None,已“设置”

    我正在尝试从以下位置下载所有产品的图像 我的蜘蛛看起来像 from shopclues items import ImgData import scrapy class multipleImages scrapy Spider name m
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐