在上一次的demo中,我们使用lambda在处理自己定义的业务时,需要自定义函数式接口,其实java8已经内置了常用的接口
四大核心内置函数式接口
Consumer<T> : 消费型接口
void accept(T t);
@Test
public void test01(){
cons("=======", (x)->System.out.println(x));
}
public void cons(String s,Consumer<String> con){
con.accept(s);
}
Supplier<T> : 供给型接口
T get();
@Test
public void test02(){
supp(()->666*2);
}
public void supp(Supplier<Integer> su) {
System.out.println(su.get());
}
Function<T, R> : 函数型接口
R apply(T t);
@Test
public void test03(){
List<Integer> fun = fun(6,(x)->{
List<Integer> list=new ArrayList<>();
for (int i = 0; i < x; i++) {
Double random = Math.random()*100;
list.add(random.intValue());
}
return list;
});
for (Integer integer : fun) {
System.out.println(integer);
}
}
public List<Integer> fun(Integer num ,Function<Integer,List<Integer>> fun){
return fun.apply(num);
}
Predicate<T> : 断言型接口
boolean test(T t);
@Test
public void test04(){
List<String> list=Arrays.asList("23456","wqew","sfsd","yfhfg");
List<String> pre = pre(list, (x)->{
String y="y";
return x.contains(y);
});
for (String string : pre) {
System.out.println(string);
}
/**
* 注意:这个地方我使用了上次练习中多个语句和一个语句,这里提醒下,当使用一条语句的时候不可以包含{}和return,而多条语句必须要语法规范,哪怕后面的;也不可以少
* 否则eclipise会认为语法有错误(我的版本是4.5.1)
*/
pre(list, (x)->x.contains("y"));
}
public List<String> pre(List<String> list,Predicate<String> s){
List<String> list1=new ArrayList<>();
for (String string : list) {
if(s.test(string)){
list1.add(string);
};
}
return list1;
};
其余的内置接口如下:
总结:老话说 纸上得来终觉浅。。。。是特别有道理的,不去动手去敲一遍,你是不会知道里面哪里有坑,更不会深入的去思考