java1.8の新機能の関数式_学習体験

免責事項:この記事は個人的な学習体験であり、実際の状況を表すものではありません。エラーがある場合、
機能インターフェイスには主に次のインターフェイスとその他の派生インターフェイスが含まれていることを指摘してください

1.Consumer<T> 代表了接受一个输入参数T并且无返回的操作
2.Function<T,R>接收一个参数T,返回R
3.Predicate<T>接收一个参数T返回一个boolean类型的值
4.Supplier<T>无参数

この記事では主に最初の3つの
学習関数式について説明します。次の知識ポイントを習得するのが最善

です。問題ではありませんが、学習はより困難です
。1.java1.8のデフォルト変更のデフォルトメソッド2.ラムダ式中
のJava 1.8 3. java1。8つのメソッドリファレンス

1.消費者<T>

Javaソースコード:Iterableインターフェースのデフォルトのメソッドforeachパラメーターはコンシューマータイプ
コード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ソースによるすべての方法で一貫した印刷結果を示すコードaction.accept(t)を示しますパラメーターはユーザーのコード002でありユーザー名は簡単に再生でき、002コード関数コードリファレンス、システムに対応します。 out.println(user.getName())は関数型パラメーターです。他の場所の変数は、関数型パラメーターのコードブロックで参照できます(注!引用する場合、コードブロック外のすべての変数は最終変更と同等です) 、次のように:直接割り当てはエラーをコンパイルします!テストコードは次のとおりです。

ここに画像の説明を挿入

    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.機能<T、R>

関数の戻り値はConsumerより1つ多く、
テストコードは次のとおりです。

    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