Consumer:消费型接口,有入参,无返回值。
void accept(T t);
Supplier:供给型接口:无入参,有返回值
T get();
Function
:函数型接口,有入参,有返回值 R apply(T t);
Predicate:断言型接口,有入参,有返回值,返回值类型确定是boolean
boolean test(T,t);
//这个就相当于声明了一个函数变量,和js很像,然后调用这个函数。之所以能这样写是因为
Function<Integer,Integer> func=p->{
System.out.println("我是函数");
return p*100;
};
func.apply(5);
//也可以这样写,定义了一个函数的行为。p->p*12,因为Function本身就是一个函数式编程,可以将函数作为参数进行传递。
Function<Integer,Integer> func2=p->p*12;
System.out.println(func2.apply(5));
System.out.println(opreator(1,2,(a,b)->a+b));
System.out.println(opreator(1,2,(a,b)->a*b));
BiFunction<Integer,Integer,Integer> bin=(a,b)->a+b;
System.out.println(bin.apply(5,10));
BiFunction<Integer,Integer,Integer> bin2=(a,b)->{
System.out.println("我是bin2");
return a*b;
};
System.out.println(bin2.apply(5,10));
public static Integer opreator(Integer a, Integer b, BiFunction<Integer,Integer,Integer> bf){
return bf.apply(a,b);
}
Consumer<String> consumer=obj->{
//这里面可以写很多逻辑
System.out.println(obj);
System.out.println("调用短信接口发送短信,或者打印日志");
};
//consumer.accept("88888");
sendMsg("88888",consumer);
List<String> list= Arrays.asList("aaa","bbb","ccc");
list.forEach(obj->{
System.out.println(obj);
});
public static void sendMsg(String phone,Consumer<String> consumer){
consumer.accept(phone);//consumer代表一个函数,phone是接收的参数。accept()方法表示这个函数运行这个参数。类似于开启新线程中的start()
}
public static Student newStudent(){
Supplier<Student> supplier=()->{
Student student=new Student();
student.setName("默认名称");
return student;
};
return supplier.get();
}
Student student=newStudent();
System.out.println(student.getName());
public static List<String> filter(List<String> list,Predicate<String> predicate){
List<String> results=new ArrayList<>();
for(String str:list){
if(predicate.test(str)){
results.add(str);
}
}
return results;
}
List<String> list=Arrays.asList("difjisfj","343dfjsj","kfjsidj","34dfjs","djfsi");
System.out.println(list);
List<String> a = filter(list, (obj) -> obj.startsWith("a"));
List<String> filter2 = filter(list, (obj) -> {
return obj.startsWith("3");
});
System.out.println(a);
这种调用方式,用来直接访问类和实例已经存在的方法或构造方法。可以通过方法引用,赋值给另外一个变量。
语法:
左边是容器(或者类名,方法名),中间是"::",右边是相应的方法名
**静态方法:**则是ClassName::methodName
**实例方法:**则是(对象)Instance::methodName
**构造函数:**则是类名::new;
Lambda表达式的使用:
Function<入参1,返回类型> func= 方法引用
应用:func.apply(入参);
BiFunction<入参1,入参2,返回类型> func=方法引用
应用:func.apply(入参1,入参2);
Function<String,Integer> fun =Integer::parseInt;
Integer apply = fun.apply("1204");
System.out.println(apply);
//使用双冒号::来构造非静态函数的引用
String text="你好啊!美女";
Function<Integer,String> func2=text::substring;
String apply1 = func2.apply(1);
System.out.println(apply1);
class User{
private String name;
private int age;
public User() {
}
public User(String name) {
this.name = name;
}
public User(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 "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
//构造函数引用,多个参数
BiFunction<String,Integer,User> biFunction=User::new;
User user2 = biFunction.apply("张三", 1);
System.out.println(user2);
Function<String,User> funct2=User::new;
User user3 = funct2.apply("张三");
System.out.println(user3);
sayHello(String::toUpperCase,"abcdefg");
public static void sayHello(Function<String,String> func,String paramer){
String result = func.apply(paramer);
System.out.println(result);
}