
一.格式:

注:这个和引用成员方法中的引用其他类的方法是有区别的,
引用其他类的方法的格式是其他类对象::方法名,其中是需要类对象的,需要new的,
而使用类名引用成员方法的格式是类名::成员方法,这里是不需要类对象的
二.练习:
需求:
集合里面有一些字符串,要求变成大写后进行输出
解答:
未使用方法引用前:
package com.itheima.a02game;
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
public class Main5 {
public static void main(String[] args) {
//1.创建集合对象
ArrayList<String> list=new ArrayList<>();
//2.添加数据
Collections.addAll(list,"aaa","bbb","ccc","ddd");
//3.操作集合数据->把集合的数据变成大写后进行输出->字符串型转为字符串型->用map方法
list.stream().map(new Function<String, String>() {
@Override
public String apply(String s) { //s依次表示流里面的每一个数据即集合list的每一个元素
return s.toUpperCase(); //toUpperCase方法可以把字符串的内容全部变成大写
}
}).forEach(s -> System.out.println(s));
}
}
使用类名引用成员方法改写后:
map方法的形参Function是一个函数式接口,所以map方法的参数内可以使用方法引用。
使用类名引用成员方法的格式为类名::成员方法,所以直接在map方法的参数内套用这个格式即可:
(需求里要把集合里的字符串的内容全部变成大写,可以使用String类里的toUpperCase方法)
package com.itheima.a02game;
import java.util.ArrayList;
import java.util.Collections;
public class Main5 {
public static void main(String[] args) {
//1.创建集合对象
ArrayList<String> list=new ArrayList<>();
//2.添加数据
Collections.addAll(list,"aaa","bbb","ccc","ddd");
//3.操作集合数据->把集合的数据变成大写后进行输出->字符串型转为字符串型->用map方法
list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));
}
}
但这里和之前有些不同:
首先看String类里的toUpperCase方法:

方法引用的前提条件之一:被引用的方法的形参和返回值,需要和抽象方法的形参和返回值保持一致,
此时的抽象方法是apply方法,形参类型是String型,返回值是字符串,
被引用的toUpperCase方法返回值是字符串,但没有形参,而且没报错,这是为什么呢?
其实这是一种特殊的方法引用->
该方法引用的规则:(该种方法引用特有的规则)
-
引用处必须是函数式接口
-
被引用的方法必须已经存在->可以是Java写好的,可以是人为写好的,也可以是第三方写好的
-
被引用的方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致
-
被引用的方法的功能需要满足当前的需求
抽象方法的形参的详解:
-
抽象方法的第一个形参:表示被引用的方法的调用者,决定了可以引用哪些类中的方法,也就是说使用当前方式进行方法引用,不是所有类里的方法都能引用,这个类是有规定的,这个主要决定于第一个形参(在之前学的引用其他类的成员方法中,该方式可以引用所有类的成员方法,只需要获取到那个类的对象,再进行方法引用即可)。例如在stream流当中,第一个参数一般都表示流里面的每一个数据,假设此时流里面的数据是字符串型,那么使用这种方式进行方法引用,只能引用String这个类中的方法
-
抽象方法的第二个参数到最后一个参数:跟被引用的方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法
注:这种方法引用带有局限性,不能引用所有类中的成员方法,能引用的方法和抽象方法的第一个参数有关,第一个参数是什么类型的,那么就只能引用这个类中的方法。
抽象方法apply的第一个参数是字符串,所以此时只能引用String类里的方法。
抽象方法apply,apply方法此时只有一个形参,并没有第二个形参,所以被引用的方法需要是无参的成员方法,所以引用toUpperCase方法是合理的,而且apply方法的返回值和toUpperCase方法的返回值一致,toUpperCase方法的功能也满足了当前的需求。
所以上述例子中map(String::toUpperCase)就可以理解为拿着流里面的每一个数据,去调用String类里的toUpperCase方法,toUpperCase方法的返回值就是转换之后的结果。
872

被折叠的 条评论
为什么被折叠?



