把已经有的方法拿过来用,当做函数式接口中的抽象方法的方法体。
1.引用处必须是函数式接口
2.被引用的方法必须已经存在
3.被引用方法的形参和返回值需要跟抽象方法保持一致
4.被引用方法的功能要满足当前的需求
方法引用的分类
1.引用静态方法
格式:类名::静态方法
package myFunction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
public class Functiondemo01 {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
Collections.addAll(list,"1","2","3","4","5");
/* list.stream().map(new Function<String,Integer>() {
@Override
public Integer apply(String s) {
int i = Integer.parseInt(s);
return i;
}
}).forEach(s-> System.out.println(s));*/
list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));
}
}
2.引用成员方法
格式:对象::成员方法
其他类:其他类对象::方法名
本类:this::方法名
父类:super::方法名
package myFunction;
import java.util.ArrayList;
import java.util.Collections;
public class Functiondemo02 {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");
// list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));
list.stream().filter(new StringOperation()::stringJudge).forEach(s-> System.out.println(s));
}
}
package myFunction;
public class StringOperation {
public boolean stringJudge(String s){
return s.startsWith("张")&&s.length()==3;
}
}
package myFunction;
import java.util.ArrayList;
import java.util.Collections;
public class Functiondemo02 {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");
// list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));
list.stream().filter(new Functiondemo02()::stringJudge).forEach(s-> System.out.println(s));
}
public boolean stringJudge(String s){
return s.startsWith("张")&&s.length()==3;
}
}
3.引用构造方法
格式:类名::new
package myFunction;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String str) {
String []arr= str.split(",");
this.name=arr[0];
this.age=Integer.parseInt(arr[1]);
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package myFunction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class FunctionDemo03 {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
Collections.addAll(list,"张无忌,15","周芷若,14","赵敏,13");
/*List<Student> newList= list.stream().map(new Function<String,Student>() {
@Override
public Student apply(String s) {
String []arr= s.split(",");
String name=arr[0];
int age=Integer.parseInt(arr[1]);
return new Student(name,age);
}
}).collect(Collectors.toList());
System.out.println(newList);*/
List<Student> newList2=list.stream().map(Student::new).collect(Collectors.toList());
System.out.println(newList2);
}
}
其他调用方式:
1.使用类名引用成员方法
格式:类名::成员方法
package myFunction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale;
import java.util.function.Function;
public class Funtiondemo04 {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
Collections.addAll(list,"aaa","bbb","ccc","ddd");
/* list.stream().map(new Function<String, String>() {
@Override
public String apply(String s) {
return s.toUpperCase();
}
}).forEach(s-> System.out.println(s));*/
list.stream().map(String::toUpperCase).forEach(s-> System.out.println(s));
}
}
引用数组的构造方法
格式:数组类型[]::new
package myFunction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.IntFunction;
public class FunctionDemo05 {
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<>();
Collections.addAll(list,1,2,3,4,5);
/* Integer[]ar= list.stream().toArray(new IntFunction<Integer[]>() {
@Override
public Integer[] apply(int value) {
return new Integer[value];
}
});
System.out.println(ar);*/
Integer[] ar2= list.stream().toArray(Integer[]::new);
System.out.println(ar2);
}
}