我觉得我对供应商用例有一些错误的解释。下面是一个示例,我想为列表添加值。但当我试图从供应商处获取列表时,它显示为空。
Supplier<List<String>> str = ArrayList::new; str.get().add("Hi"); System.out.println(str.get().size());
返回:0
vm0i2vca1#
Supplier<List<String>> 是一个函数,每当 get 方法正在运行。就你而言, str 类似于以下lambda表达式:
Supplier<List<String>>
get
str
Supplier<List<String>> str = () -> new ArrayList<>();
也就是说每次 str.get() 调用时,函数被调用,而主体 new ArrayList<>() 执行,从而每次生成一个新列表。如果你想要 Supplier 要始终返回相同的列表,则需要捕获它:
str.get()
new ArrayList<>()
Supplier
List<String> list = new ArrayList<>(); Supplier<List<String>> str = () -> list;
每次都是这样 str.get() 运行时,它将返回它捕获的相同列表。但是,依我看,这似乎不是一个好的做法,只保留对变量的引用而不是将其保留在供应商后面(这意味着函数产生了一个值)似乎更为正确。
kninwzqo2#
每次呼叫 str.get() 将示例化一个新的 List ,它将是空的。你的两个电话 str.get() 返回两个不同的示例。您向第一个元素添加了一个元素 List ,但第二个 List 是空的。您必须存储对已创建对象的引用 List 如果您想访问它:
List
List<String> list = str.get(); list.add("Hi"); System.out.println(list.size());
2条答案
按热度按时间vm0i2vca1#
Supplier<List<String>>
是一个函数,每当get
方法正在运行。就你而言,
str
类似于以下lambda表达式:也就是说每次
str.get()
调用时,函数被调用,而主体new ArrayList<>()
执行,从而每次生成一个新列表。如果你想要
Supplier
要始终返回相同的列表,则需要捕获它:每次都是这样
str.get()
运行时,它将返回它捕获的相同列表。但是,依我看,这似乎不是一个好的做法,只保留对变量的引用而不是将其保留在供应商后面(这意味着函数产生了一个值)似乎更为正确。kninwzqo2#
每次呼叫
str.get()
将示例化一个新的List
,它将是空的。你的两个电话
str.get()
返回两个不同的示例。您向第一个元素添加了一个元素List
,但第二个List
是空的。您必须存储对已创建对象的引用
List
如果您想访问它: