java基础-方法引用

复制代码
package Day04;

import java.util.Arrays;
import java.util.Comparator;

public class methodReference1 {
    public static void main(String[] args) {
        //需求:创建一个数组,进行倒序排列
        Integer[] arr={3,5,4,1,6,2};
        //
        //1、匿名内部类
        Arrays.sort(arr,new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        for (Integer i : arr) {
            System.out.print(i+",");
        }
        //lamdba表达式
        //需求:创建一个数组,进行倒序排列
        Integer[] arr1={3,5,4,1,6,2};
        Arrays.sort(arr1,(Integer o1,Integer o2)->{return o2-o1;});
        System.out.println(Arrays.toString(arr1));
        //简写的lamdba表达式
        Integer[] arr2={3,5,4,1,6,2};
        Arrays.sort(arr2,(o1, o2)->o2-o1);
        System.out.println(Arrays.toString(arr2));

        //方法引用
        //条件:
        //1、引用处必须是函数式接口
        //2、被引用的方法必须已经存在,如果引用的方法不存在,就需要自己编写
        //3、被引用的形参和返回值需要和抽象方法的形参和返回值类型保持一致
        //4、被引用的方法的功能需要满足当前的要求
        Integer[] arr3={3,5,4,1,6,2};
        //引用的方式是类名::静态方法
        //注意看,这里是不要传参的,是把这个方法当作抽象方法的方法体
        Arrays.sort(arr3,methodReference1::getstraction);
        System.out.println(Arrays.toString(arr3));

    }
    public static int getstraction(int n1,int n2){
        return n2-n1;
    }
}

方法引用的分类:

1、引用静态方法

格式:类名::静态方法

示例:Integer::parseInt

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class methodReference2 {
    public static void main(String[] args) {
        //String 集合中有如下数字,把他们变为int类型
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"1","2","3","4","5");

        List<Integer> collect = list.stream().map(Integer::parseInt).collect(Collectors.toList());
        System.out.println(collect);

        //如果使用匿名内部类,对比看,可能会清楚一点
        list.stream()
                .map(new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.parseInt(s);
                    }
                });
    }
}

被引用的形参和返回值需要和抽象方法的形参和返回值类型保持一致

2、引用成员方法

格式:对象::成员方法

分三种情况:

(1)其他类:其他类的对象::方法名称

(2)本类:this::方法名称

复制代码
//需要特别注意:因为在static中没有this,所以在静态的main方法中是没有办法直接用this调用的
//你可以有两种方法:1、还是创建本类的对象,2、单独写一个非静态的方法,就可以用this::getstr了

(3)父类:super::方法名称

父类和本类其实是类似的

//需要特别注意:因为在static中没有this,所以在静态的main方法中是没有办法直接用this调用的 //你可以有两种方法:1、还是创建本类的对象,2、单独写一个非静态的方法,就可以用this::getstr了

所以,要注意,在本类或者父类中,你如果是用this或者是super引用方法,就说明这个时候这个方法是一个非静态的。那么就不能直接在psvm下面直接运行,你可以通过实现对象来获得最终效果。

3、引用构造方法

格式:类名::new

范例:Student::new

这里引用的构造方法一定要

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class methodReference4 {
    public static void main(String[] args) {
        //集合中存有姓名和年龄,比如:张无忌,15
        //将数据封装成student对象,并收集到List集合中

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌,15","周芷若,16","灭绝师太,30","张三丰,100");
        List<Student> collect = list.stream()
                //.map(s->new Student(s.split(",")[0],Integer.parseInt(s.split(",")[1])))
                .map(Student::new)
                .collect(Collectors.toList());
        System.out.println(collect);
    }
}
复制代码
package Day04;

public class Student {
    private String name;
    private int age;

    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student(String s) {
        this.name=s.split(",")[0];
        this.age=Integer.parseInt(s.split(",")[1]);
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

4、其他的方法引用

4.1:类名引用成员方法

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Collections;

public class methodReference5 {
    public static void main(String[] args) {
        //集合中有一些英文字母,变成大写再输出
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"a","b","c","d","e","f");
        list.stream()
                .map(String::toUpperCase)
                .forEach(s-> System.out.print(s));
    }
}

类名引用成员方法独有的:

1、需要有函数式接口

2、被引用的方法必须存在

3、被引用方法的形参需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致

4、被引用方法的功能需要满足当前的需求

4.2:引用数组的构造方法

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class methodReference6 {
    public static void main(String[] args) {
        //集合中存储一些整数,并收集到数组中

        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Integer[] array = list.stream()
                .toArray(Integer[]::new);
        for (Integer i : array) {
            System.out.print(i);
        }
    }
}

方法引用总结:

方法引用的小练习:

练习1:

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class methodReference7 {
    public static void main(String[] args) {
        //集合中存储一些字符串的数据,比如"张三,23",
        //收集到Students类型的数组中(方法引用)

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张三,23","李四,24","王五,25");
        //引用Students的构造方法
        Students[] array = list.stream()
                .map(Students::new)
                .toArray(Students[]::new);

        for (Students students : array) {
            System.out.println(
                    students.getName()+","+students.getAge()
            );
        }
    }
}

练习2:

复制代码
package Day04;

import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class methodReference8 {
    public static void main(String[] args) {
        //创建集合添加学生对象
        //学生对象属性:name,age
        //要求:获取姓名并且放在数组中(使用方法引用)
        ArrayList<Students> list=new ArrayList<>();
        Collections.addAll(list,new Students("张三",23),
                new Students("李四",24),
                new Students("王五",25));
        String[] array = list.stream()
                .map(Students::getName())
                .toArray(String[]::new);
        System.out.println(Arrays.toString(array));
    }
}

练习3:

复制代码
package Day04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class methodReference9 {
    public static void main(String[] args) {
        //创建集合添加学生对象,学生的属性:姓名和年龄
        //把姓名和年龄拼接成字符串,比如张三-23,并放到数组当中

        ArrayList<Students> list=new ArrayList<>();
        Collections.addAll(list,new Students("张三一",23),
                new Students("李四二",24),
                new Students("王五三",25));
        String[] array = list.stream()
                .map(Students::toString)
                .toArray(String[]::new);
        System.out.println(Arrays.toString(array));
    }
}
相关推荐
winfreedoms2 分钟前
java-网络编程——黑马程序员学习笔记
java·网络·学习
Tisfy2 分钟前
LeetCode 3010.将数组分成最小总代价的子数组 I:排序 OR 维护最小次小
算法·leetcode·题解·排序·最小次小值
Learn Beyond Limits6 分钟前
文献阅读:A Probabilistic U-Net for Segmentation of Ambiguous Images
论文阅读·人工智能·深度学习·算法·机器学习·计算机视觉·ai
开开心心就好13 分钟前
键盘改键工具免安装,自定义键位屏蔽误触
java·网络·windows·随机森林·计算机外设·电脑·excel
IManiy13 分钟前
总结之Temporal全局速率控制(二)第三方速率控制服务设计
java
雨季66614 分钟前
Flutter 三端应用实战:OpenHarmony “极简手势轨迹球”——指尖与屏幕的诗意对话
开发语言·javascript·flutter
m0_7369191018 分钟前
编译器命令选项优化
开发语言·c++·算法
Stream_Silver20 分钟前
【Agent学习笔记1:Python调用Function Calling,阿里云API函数调用与DeepSeek API对比分析】
开发语言·python·阿里云
froginwe1120 分钟前
CSS3 多媒体查询实例
开发语言
OpenMiniServer21 分钟前
电气化能源革命下的社会
java·人工智能·能源