【Java8 新特性 3】Supplier简介

本文介绍了Java8中的Supplier接口,它常用于表示工厂,实现依赖注入,提高类的灵活性。通过代码实例展示了如何使用Supplier创建对象,并通过lambda表达式与Supplier结合使用。Supplier接口仅包含一个get()方法,每次调用会产生新的对象。文章还分析了Supplier的源码并讨论了与new操作符的区别。

在Java8中增加的接口Supplier,最适合用于表示工厂。带有Supplier的方法,通常应该限制输入工厂的类型参数使用有限制的通配符类型,以便客户端能够传入一个工厂,来创建指定类型的任意子类型。

应该将这些资源或者工厂传给构造器(或者静态工厂、或者构建器),通过他们来创建类。这个实践就被称做依赖注入,它极大地提高了类的灵活性、可重用性和可测试性。

简而言之,Supplier就是用来创建对象的,相当于new。

2、代码实例

package com.guor.effective.chapter2.java8;

import java.util.function.Su 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 pplier;

public class TestSupplier {

private int age;

public static void test(){

System.out.println(“Java8新特性,Supplier”);

}

TestSupplier(){

System.out.println(“构造函数,age,”+age);

}

public static void main(String[] args) {

//创建Supplier容器,声明为TestSupplier类型,此时并不会调用对象的构造方法,即不会创建对象

Supplier sup= TestSupplier::new;

sup.get().test();

System.out.println(“--------”);

//调用get()方法,此时会调用对象的构造方法,即获得到真正对象

sup.get();

//每次get都会调用构造方法,即获取的对象不同

System.out.println(“是否是相同的对象实例”+sup.get()==sup.get().toString());

}

}

3、控制台输出

4、通俗易懂

private static int getMax(Supplier supplier) {

return supplier.get();

}

private static void test01() {

Integer[] arr = {10,2,5,3,9,4};

int max2 = getMax(() -> {

int max = 0;

for(Integer i : arr) {

if(i > max) {

max = i;

}

}

return max;

});

System.out.println(max2);//10

}

二、Supplier源码分析


Supplier接口源码中只有一个get()方法。

每次get都会调用构造方法,即获取的对象不同。

/*

  • Copyright © 2012, 2013, Oracle and/or its affiliates. All rights reserved.

  • ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.

*/

package java.util.function;

/**

  • Represents a supplier of results.

  • There is no requirement that a new or distinct result be returned each

  • time the supplier is invoked.

  • This is a functional interface

  • whose functional method is {@link #get()}.

  • @param the type of results supplied by this supplier

  • @since 1.8

*/

@FunctionalInterface

public interface Supplier {

/**

  • Gets a result.

  • @return a result

*/

T get();

}

可以看到这份代码中,有一个比较奇特的注解@FunctionalInterface,这是一个函数式接口的声明。该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。

三、lambda表达式与Supplier的组合使用


为何不直接使用new?而使用Supplier,感觉华而不实,和new有啥区别?

1、person类

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值