Java 方法引用




demo
TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return 0;
}
});
Comparator 需要一个 传参是两个 String 且返回 int 的函数
public class main {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<>(Utils::method);
treeSet.add("a");
treeSet.add("ab");
treeSet.add("c");
System.out.println(treeSet);
}
}
package fangfayinyong;
public class Utils {
public static Integer method(String a,String b){
return a.length()-b.length();
}
}
示例
ArrayList<String> list= new ArrayList<>();
Collections.addAll(list,"1","2","3");
list.stream().map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s);
}
}).forEach(s-> System.out.println(s));
- 只有一个方法需要重写, 是函数接口
- 方法参数是
String 返回是 Integer, 找一个方法满足类型条件即可
- 这里使用
Integer.parseInt()
// 只看传参和返回值类型即可
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
ArrayList<String> list= new ArrayList<>();
Collections.addAll(list,"1","2","3");
list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));
引用构造方法
ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1,"xiaohong,19","xiaoliu,19","xiaoli,18","xiaohan,18" );
list1.stream().map(new Function<String, Student>() {
@Override
public Student apply(String s) {
return new Student(s);
}
}).forEach(s-> System.out.println(s));
public Student(String s) {
String name = s.split(",")[0];
Integer age = Integer.valueOf(s.split(",")[1]);
this.name = name;
this.age = age;
}
- 改为方法引用, 自动识别使用只含有一个参数的构造函数
ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1,"xiaohong,19","xiaoliu,19","xiaoli,18","xiaohan,18" );
list1.stream().map(Student::new).forEach(s-> System.out.println(s));
String[] array = list.stream().toArray(new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
// value 是流上的元素个数
return new String[value];
}
});
String[] array = list.stream().toArray(String[]::new);
引用的参数问题

- 下面
toUpperCase() 没有参数传入, 但 apply () 需要 传 String,
toUpperCase() 不是 static 修饰的, 所以 第一个参数(默认省略) 是 this, this 是 String 类型的, 符合 apply 的传参要求.

- 因为传入的方法没有参数, 因此流中的每个数据会直接调用该函数, 返回值还是返回值;
- 流的类型, 流元素的类型时
String 因此只能穿 String类下面的成员方法
- 返回值的类型, 一致即可