java 8新特性——函数式接口

函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以被隐式转换为 lambda 表达式。

常用的函数式接口

Supplier

Supplier,它的中文意思为供应商、提供者。具体的方法也是相当的简单,不接受任何参数,返回一个结果

/**
*源码
**/
@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

测试:

/**
 * @author: zhouzhou
 * @date:2021/10/27 15:01
 */
public class Test {
    public static void main(String[] args) {
        User result= testSupplier(()-> new User("王也", 1));
        String result2 = testSupplier(() -> "测试Supplier接口");
        
        System.out.println(result.toString());
        System.out.println(result2);
    }
    /**
     * description: 供给型接口,无输入有输出
     *
     * @param supplier
     * @return java.lang.String
     */
    private static <T> T testSupplier(Supplier<T> supplier){
        return supplier.get();
    }
}

运行结果:

User(name=王也, age=1)
测试Supplier接口

我们也可使用使用Suppler创建对象。

        Supplier<User> supplier = User::new;
        User user = supplier.get();

Consumer

接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据, 其数据类型由泛型决定。

public class Test {
    public static void main(String[] args) {
       /**
         * testConsumer()方法中第二个参数传递的是消费性接口Consumer<T>的实例
         * 分析x -> System.out.println("传入的数字为:" + x)
         *    x:为传递的参数
         *    System.out.println("传入的数字为:" + x)相当于抽象方法accept()的方法体	
         */
        testConsumer(2 ,i -> System.out.println("传入的数字为:"+i));
    }

    /**
     * description: 消费性接口有输入,但是没有返回值
     *
     * @param t
     * @param consumer
     * @return void
     */
    private static <T> void testConsumer(T t, Consumer<T> consumer) {
        // accept()方法为消费性接口Consumer<Integer>的唯一抽象方法
        consumer.accept(t);
    }
}

-----------------------------
console:
    传入的数字为:2

Predicate

Predicate的使用(构造断言式)含有一个抽象方法test(),有输入,输出为Boolean。含有4个由default修饰的具体实现方法and()、or()、negate()、isEquals()

  • and()对应java的连接符 &&;

  • or()对应java的连接符 || ;

  • negate()对应java的连接符 ! ;

  • isEquals对应java的连接符 == ;

public class Test {
    public static void main(String[] args) {
        //判断1==2?
        Boolean result = testPredicate(1, i -> i.equals(2));
        System.out.println(result);
    }
    /**
     * description:断言型接口,有输入,输出为Boolean
     *
     * @param t
     * @param predicate
     * @return java.lang.Boolean
     */
    private static <T> Boolean testPredicate(T t, Predicate<T> predicate) {
        // test()方法为断言型接口Predicate<T>的唯一抽象方法
        return predicate.test(t);
    }
}


-----------------------------------
    console:
	false

Function

Function<T, R>接口有两个参数,一个是输入,一个输出,先这么理解。T输入 R输出。

  • R apply(T t) :输入参数T,经过该函数处理得到R。也就是将参数应用于这个函数。
public class Test {
    public static void main(String[] args) {
        String str = testFunction("hello", hello -> hello + "World");
        System.out.println(str);
    }
    private static <T,R> R testFunction(T t, Function<T, R> function) {
        // apply()方法为函数型接口Function<T, R>的唯一抽象方法
        return function.apply(t);
    }

}

---------------------
    console:
	helloWorld

ps:我朋友给我的代码包含的这个函数式接口,我就想了解一下,看了半天的代码和源码,稍微整理一下,也没多少东西,可能因为我在实际项目中还没有遇到吧。后续遇到在去更新吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值