第九天Java基础(常用的函数接口)
1.常用的函数接口
1.1 自定义函数接口的方式
1.只有一个抽象方法的接口。
函数式接口,在使用Lambda表达式实现时,一般延迟加载重写的内容。当实现内部的代码被使用时,代码才会执行。
1.2 常用的函数接口
1.supplier接口,生产数据
重写get(),返回泛型类型的数据
//1.定义一个方法生产数据
public static int getMax(Supplier<Integer> map){
return map.get();
}
public static void main(String[] args) {
int []ints = {100,2,-5,55,-100};
int max = getMax(new Supplier<Integer>() {
@Override
public Integer get() {
//2.如何生产自定义
int max = ints[0];
for (int i : ints) {
if(i>max){
max = i;
}
}
return max;
}
});
System.out.println(max);
}
2.Consumer接口,消费数据
重写accept(String str)方法
//1.定义一个方法,消费数据,不返回数据
public static void getString (String name , Consumer<String> cs){
cs.accept(name);
}
public static void main(String[] args) {
getString("赵丽颖",(name)->{
//2.自定义消费方式
String str = new StringBuffer(name).reverse().toString();
System.out.println(str);
});
}
andThan()方法的使用
//1.对于数据str来说,可能需要两种消费方式,所以传递两个Consumer
public static void outStirng(String str , Consumer<String> con1,Consumer<String> con2){
//2.Consumer执行方式一
con1.accept(str);
con2.accept(str);
//3.也可以用andThen进行连接
con1.andThen(con2).accept(str);
}
public static void main(String[] args) {
outStirng("AbCd",(t)->{
System.out.println(t.toUpperCase());
},(t)->{
System.out.println(t.toLowerCase());
});
}
小练习
public static void outArray(String[] str, Consumer<String> con1, Consumer<String> con2){
for (String s : str) {
con1.andThen(con2).accept(s);
}
}
public static void main(String[] args) {
String[] str = {"迪丽热巴,女","古力娜扎,女","马儿扎哈,男","卡发卡,男"};
outArray(str,(t)->{
String[] strs = t.split(",");
System.out.print("姓名:"+strs[0]+",");
},(t)->{
String[] strs = t.split(",");
System.out.println("性别:"+strs[1]+"。");
});
}
3.Predicate接口,判断数据,你给我一个数据,我判断,返回boolean
重写test()方法,返回boolean
使用方式和前面一样
public static boolean checkString (String str, Predicate<String> pred){
return pred.test(str);
}
public static void main(String[] args) {
boolean b = checkString("ABCDEF",(t)->{
return t.length()==5;
});
System.out.println(b);
}
方法:与或非
- and();//可以连接多个判断条件
具体的写法
return pre1.and(per2).test(str);
与
return pre1.test(str) && pre2.test(str);等价
2.or();
return pre1.or(per2).test(str);
与
return pre1.test(str) || pre2.test(str);等价
3.negate();
return pre1.negate().test(str);
与
return !pre1.test(str);等价
小练习:把符合两个条件的数组放入集合中
public static ArrayList<String> criterionArrayString(String[]str , Predicate<String> pre1,Predicate<String> pre2){
ArrayList<String> arr = new ArrayList<>();
for (String s : str) {
boolean b = pre1.and(pre2).test(s);
if (b){
arr.add(s);
}
}
return arr;
}
public static void main(String[] args) {
String[] str = {"迪丽热巴,女","古力娜扎,女","马儿扎哈,男","卡发卡,男"};
ArrayList<String> arr = criterionArrayString(str, (t) -> {
String[] split = t.split(",");
if ("女".equals(split[1])) {
return true;
}
return false;
}, (t) -> {
String[] split = t.split(",");
if (split[0].length() == 4) {
return true;
}
return false;
});
System.out.println(arr);
}
4.Function<T,R>接口,类型转化接口
方法apply(T t);返回R类型的数据
默认方法
andThan(),与前面的一样