!!!声明:本文为个人学习心得,不代表实际情况,有错误请指出
函数式接口主要包括以下几个接口和衍生出来的其他接口:
1.Consumer<T> 代表了接受一个输入参数T并且无返回的操作
2.Function<T,R>接收一个参数T,返回R
3.Predicate<T>接收一个参数T返回一个boolean类型的值
4.Supplier<T>无参数
本文主要讲解前三种
学习函数式最好掌握以下知识点,不会也没关系,只是学习比较吃力:
1.java1.8中 default 修饰的默认方法
2.java1.8中 lambda表达式
3.java1.8中 方法引用
1.Consumer< T>
java源码:Iterable接口中的默认方法foreach参数就是Consumer类型
代码001
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
调用方式如下几种方式:
代码002
List<User> userList=new ArrayList<>();//数据省略不写
//1.普通for循环
for(int i=0;i<userList.size();i++){
System.out.println(userList.get(i).getName());
}
//2.foreach
for(User user:userList){
System.out.println(userList.get(i).getName());
}
//3.重点:最复杂,新手最易懂的方式
userList.forEach(user->{
System.out.println(user.getName());
});
//4.函数式参数只有一句代码时可以简化去掉大括号,去掉分号
userList.forEach(user -> System.out.println(user.getName()));
以上所有方式的代码打印结果一致
根据代码上边001的源码分析可知for循环中action.accept(t); 的参数就是代码002中的user ,
user的名字随便起,相当于002代码里函数式代码的引用,System.out.println(user.getName()) 就是函数式的参数,在函数式参数的代码块中可以引用其他地方的变量,(注意!引用时,在代码块外所有变量相当于被final修饰),如下:
直接赋值会编译报错!
测试使用代码如下:
public static void main(String[] args) {
User user=new User(1,"Jack");
test1(user,u->{
System.out.println("我的朋友是:"+u.getName());
});
test1(user,u->{
System.out.println("我的哥哥是:"+u.getName());
});
}
public static void test1(User user,Consumer<? super User> consumer){
System.out.println("----这里是大量逻辑代码1");
consumer.accept(user);
System.out.println("----这里是大量逻辑代码2");
}
运行结果:
2.Function<T,R>
Function相较于Consumer多了个返回值
测试代码如下:
public static void main(String[] args) {
callTest2();
}
public static void callTest2(){
List<User> userList=new ArrayList(){
{
add(new User(11,"Jack"));
add(new User(12,"zhangsan"));
add(new User(23,"lisi"));
add(new User(34,"wangwu"));
}};
test2(userList,user -> {
if(user.getAge()<18){
return "未成年";
}
return "已经成年";
});
}
public static void test2(List<User> list, Function<? super User,? extends String> function){
System.out.println("----这里是大量逻辑代码1");
list.forEach(user->{
System.out.println(user.getName()+":"+function.apply(user));
});
System.out.println("----这里是大量逻辑代码2");
}
运行结果:
未完待续