-
函数式接口:只有一个抽象方法的接口(可以有私有,默认,和protect的方法)
-
@Override重写的注解
-
@FunctionalInterface(抽象方法的个数大于1个会报错),定义在接口名上面检测是否为函数式接口,源代码里没有实际内容,是个接口的标记
-
匿名内部类:会生成$的class文件 lambda不会生成 class文件
-
不确定一个方法中的业务逻辑怎么实现的时候,可以用一个接口封装它的业务逻辑
-
Lambda 作为方法的参数的时候,lambda的返回值给了参数
-
Lambda 作为返回值的时候,返回类型是接口类型,返回的是实现了接口的实现类。
-
Supplier 生产型接口,指定接口的泛型是什么类型,就获取什么类型的数据 方法是get() 返回的是泛型 T;
数组的排序 获取一个比较器,lambda中嵌套lambda -
Consumer 消费类型接口,指定接口的泛型是什么类型,就消费什么类型, 方法是accept(T ) 参数是泛型的类型 没有返回值类型。意义是消费一个接口上定义的泛型类型的数据,accept是消费的逻辑实现。把两个消费类型接口当作参数传给方法
-
- Andthen 把两个消费者合并,并依次消费。
-
Supplier 生产者的意义是:得到一个想要的XXX类型的数据(跟泛型一致),获取的逻辑是在get()方法里实现的,比如获取一个比较器。实现数组中,求最大值
-
Predicate 断言 方法test()参数是泛型类型的参数,返回类型是boolean test()方法里是判断的逻辑实现。
如果判断条件有两部分,可以用一个predicate的test逻辑去实现判断。 -
1.and 两个断言的对象 1.and(2)
-
2.or 两个断言对象
-
3.negate() 非(取反)
-
当方法中的判断条件不确定的时候,可以在方法的接口上用predicate接口的实现类,去实现 判断的逻辑
-
Function(T,R) T参数类型 R返回值类型 R apply(T)
-
andThen 将多个function连接起来 将第一个function 的结果当作第二个function的参数使用,有点像一个命令会执行好几个动作,像外挂的柑橘
-
Arrays.sort(array,comparator) 返回值为void 直接改变原来的字符串,int[] 类型的数组要转化成Integer[]后才能使用new comparator() 的方法
-
数组的排序
//匿名内部类的实现
Supplier<Comparator<Integer>> supplier = new Supplier<Comparator<Integer>>() {
@Override
public Comparator<Integer> get() {
return new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
};
}
};
//lambda表达式的实现
Supplier<Comparator<Integer>> supplier = () -> (o1, o2) -> o1 - o2;
- 从数组中获取最大值:
public static void main(String[] args) {
int[] arr = {11,33,88,55,876};
Supplier<Integer> supplier = new Supplier<Integer>() {
@Override
public Integer get() {
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if(arr[i]>max);
max = arr[i];
}
return max;
}
};
int max = supplier.get();
System.out.println(max);
- 先把字符串小写打印,再把字符串大写打印
public static void main(String[] args) { //lambad的实现 fun(str1-> System.out.println(str1.toLowerCase()),str2-> System.out.println(str2.toUpperCase()),"i love YOU!!"); } //方法里传递的是接口类型 public static void fun(Consumer<String> con1,Consumer<String> con2,String str){ con1.andThen(con2).accept(str); }
- 按格式打印姓名性别:
public static void main(String[] args) { String[] array = { "迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男" }; Consumer<String> consumer1 = str -> System.out.print(str.split(",")[0]); Consumer<String> consumer2 = str-> System.out.println(str.split(",")[1]); for (String s : array) { consumer1.andThen(consumer2).accept(s); } }
- 双重判断案例
public static void main(String[] args) {
String[] array = { "迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男" };
ArrayList<String> list = getlist(array, s -> {
String[] str = s.split(",");
return str[1].equals("女") && str[0].length() == 4;
});
System.out.println(list);
}
public static ArrayList<String> getlist(String[] arr, Predicate<String> predicate1){
ArrayList<String> list = new ArrayList<>();
for (String s : arr) {
if(predicate1.test(s)){
list.add(s);
}
}
return list;
}