Looking to the future is the order of the day, no worrying about old news
—— 24.6.19
一、函数式接口
1.定义
有且只有一个抽象方法的接口
2.检测
@FunctionalInterface
3.示例
@FunctionalInterface
public interface USB {
void open(String s);
}
public class Demo307Test01 {
public static void main(String[] args) {
method(new USB() {
@Override
public void open(String s) {
System.out.println("开启了");
}
});
System.out.println("——————————————————Lambda表达式———————————————————");
method((String s) -> {
System.out.println("Lamba表达式:开启了");
});
System.out.println("——————————————————Lambda表达式省略版———————————————————");
method(s -> System.out.println("简化版:开启了"));
}
public static void method(USB usb){
usb.open("鼠标");
}
}
二、JDK自带的函数式接口
1.Supplier接口
1.supplier接口
java.util.function.supplier<T>接口,它意味着"供给" -> 我们想要什么就给什么
2.方法:
T get() -> 我们想要什么,get方法就可以返回什么
3.需求:
使用supplier接口作为方法的参数
用Lambda表达式求出int数组中的最大值
import java.util.Arrays;
import java.util.function.Supplier;
public class Demo308Supplier {
public static void main(String[] args) {
method(new Supplier<Integer>() {
@Override
public Integer get() {
int[] arr = {4,3,4,6,7};
Arrays.sort(arr);
return arr[arr.length-1];
}
});
method(() -> {
int[] arr = {4,3,4,6,7};
Arrays.sort(arr);
return arr[arr.length-1];
});
}
public static void method(Supplier<Integer> supplier){
Integer value = supplier.get(); // 让get方法返回一个数组最大值
System.out.println("value =" + value);
}
}
4.泛型:
<引用数据类型> -> 规定了我们操作的数据是什么类型
<>中只能写引用数据类型,不能写基本数据类型
2.Consumer接口
java.util.function.consumer<T> —> 消费型接口 —> 操作
方法:
void accept(T t),意为消费一个指定泛型的数据
"消费"就是"操作”,至于怎么操作,就看重写accept方法之后,方法体怎么写了
示例:
import java.util.function.Consumer;
public class Demo309Consumer {
public static void main(String[] args) {
method(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s.length());
}
},"一切都会好的");
System.out.println("——————————————————————————Lambda方法—————————————————————————");
method(s -> System.out.println(s.length()),"一切都会好的");
}
public static void method(Consumer<String> consumer,String s){
consumer.accept(s);
}
}
3.Function
java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据
方法:
R apply(T t) 根据类型T参数获取类型R的结果
import java.util.function.Function;
public class Demo310Function {
public static void main(String[] args) {
method(new Function<Integer, String>() {
@Override
public String apply(Integer integer) {
return integer+"";
}
},100);
}
public static void method(Function<Integer,String> function,Integer number){
String s = function.apply(number);
System.out.println("s = "+ (s+1));
}
}
Lambda:
import java.util.function.Function;
public class Demo310Function {
public static void main(String[] args) {
method((Integer integer) -> integer+"",100);
}
public static void method(Function<Integer,String> function,Integer number){
String s = function.apply(number);
System.out.println("s = "+ (s+1));
}
}
4.Predicate
java.util.function.Predicate<T>接口 —> 判断型接口
boolean test(T t) —> 用于判断的方法,返回值为boolean型
import java.util.function.Predicate;
public class Demo311Predicate {
public static void main(String[] args) {
method((String s) -> s.length() == 7,"一切都会好的");
}
public static void method(Predicate<String> predicate, String str) {
boolean test = predicate.test(str);
System.out.println("test = " + test);
}
}