匿名类、函数式接口

  • Lambda
  • Supplier函数式接口
  • Consumer
  • Consumer then
  • predict
  • predicate and


Lambda

【匿名类】
Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。
常见有匿名类实现接口:

new Thread(new Runnable() {
            @Override
            public void run() {
                
            }
        });

jquery 匿名函数调用 java匿名函数的实际应用_匿名类

注意接口在Java8之后提供了方法实现,即被default关键词修饰的方法。但是default方法不被认为是接口的方法,即在Lambda表达式 时不算在内。

口诀: 拷贝小括号 写死右箭头 落地大括号

Supplier函数式接口

使用Supplier传参可以减少代码的浪费执行,只有有必要时才执行。

jquery 匿名函数调用 java匿名函数的实际应用_函数式接口_02

package com.lambda;

import java.util.function.Supplier;

public class SupplierDemo {

    public static String getFirstString(String s1, Supplier<String> s2Supplier){
        if( s1 != null && s1.length() > 0) return s1;
        //只有当s1为null时才通过Supplier函数式接口调用生成s2的方法
        String s2 = s2Supplier.get();
        if( s2 != null && s2.length() > 0) return s2;
        return null;
    }
    public static void main(String[] args) {
        System.out.println(getFirstString("", new Supplier<String>() {
                    public String get() {
                        return makeString();
                    }
                })
        );
        //lambda表达式 写法
        System.out.println(getFirstString("",() -> makeString()));


    }

    private static String makeString() {
        System.out.println("makeString ……");
        return String.format("%d %s", 1, "hello");
    }
}

Consumer

package com.lambda;

import java.util.function.Consumer;

public class ConsumerDemo {

    public static void forEach(int nums[], Consumer<Integer> consumer){
        if( nums == null || consumer == null) return;
        for(Integer num: nums){
            //该函数式接口接受num
            consumer.accept(num);
        }
    }

    public static void main(String[] args) {
        int nums[] = {1, 2, 3, 4, 5};
        forEach(nums, new Consumer<Integer>() {
            //接收到这里
            @Override
            public void accept(Integer integer) {
                System.out.println(integer + 10);
            }
        });
		//lambda 写法
        forEach(nums,integer -> System.out.println(integer + 10));


    }
}

Consumer then

相当于 c1.accept(n) ,c2.accept(n)

jquery 匿名函数调用 java匿名函数的实际应用_函数式接口_03

predict

test() 传判断表达式。

jquery 匿名函数调用 java匿名函数的实际应用_System_04

predicate and

两个表达式都要满足。

jquery 匿名函数调用 java匿名函数的实际应用_lambda_05