Java 方法引用

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, thisString 类型的, 符合 apply 的传参要求.

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