java1.8新特性之函数式_学习心得

!!!声明:本文为个人学习心得,不代表实际情况,有错误请指出
函数式接口主要包括以下几个接口和衍生出来的其他接口:

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");
    }

运行结果:
在这里插入图片描述
未完待续

猜你喜欢

转载自blog.csdn.net/qq_41844287/article/details/114240595