我觉得我对供应商用例有一些错误的解释。 下面是一个我想向列表添加值的示例。但是当我尝试从供应商处获取列表时,它显示为空。
Supplier<List<String>> str = ArrayList::new;
str.get().add("Hi");
System.out.println(str.get().size());
返回: 0
Supplier<List<String>>
是一个函数,每当运行get
方法时都会被调用。
在您的情况下,str
类似于以下 lambda 表达式:
Supplier<List<String>> str = () -> new ArrayList<>();
这意味着每次调用str.get()
时,都会调用函数,并执行正文new ArrayList<>()
,从而每次都会生成一个新列表。
如果您希望Supplier
始终返回相同的列表,则需要捕获它:
List<String> list = new ArrayList<>();
Supplier<List<String>> str = () -> list;
这样,每次str.get()
运行时,它只会返回它捕获的相同列表。但是,IMO,这似乎不是好的做法,只保留对变量的引用而不是将其保留在供应商后面(这意味着产生值的函数)似乎是相当正确的。
每次调用str.get()
都会实例化一个新的List
,该将为空。
对str.get()
的两个调用返回两个不同的实例。您在第一个List
中添加了一个元素,但第二个List
为空。
如果要访问已创建List
,则必须存储对它的引用:
List<String> list = str.get();
list.add("Hi");
System.out.println(list.size());