假设我有一个方法将只读视图返回到成员列表:
class Team {
private List < Player > players = new ArrayList < > ();
// ...
public List < Player > getPlayers() {
return Collections.unmodifiableList(players);
}
}
Run Code Online (Sandbox Code Playgroud)
进一步假设所有客户端都立即迭代一次列表.也许将玩家放入JList或其他东西.客户端就不能存储到列表的引用以便稍后进行检查!
鉴于这种常见情况,我应该返回一个流吗?
public Stream < Player > getPlayers() {
return players.stream();
}
Run Code Online (Sandbox Code Playgroud)
或者在Java中返回非惯用的流?设计的流是否始终在它们创建的同一表达式中"终止"?
我有一种情况,我正在读取数据库并返回a List<String>,其中每个字符串被选中并根据某些条件添加到列表中.方法签名是:
public List<String> myMethod(String query, int limit)
Run Code Online (Sandbox Code Playgroud)
第二个参数提供返回列表大小的上限(设置limit=-1将删除任何大小限制).为了避免使这个方法占用大量内存,我编写了一个返回Stream<String>而不是列表的等效方法.(注意:我不需要随机访问返回的元素或任何其他特定于列表的功能.)
但是,我对返回a有点怀疑Stream<>,特别是因为该方法是公开的.使用Stream<>Java 返回公共方法是否安全?
在Java 8中,我越来越多地用Collection返回值替换Stream.
那么我曾经拥有过的地方:
public List<Element> getElementList() {
return elements;
}
Run Code Online (Sandbox Code Playgroud)
我现在正在使用:
public Stream<Element> streamElements() {
return elements.stream();
}
Run Code Online (Sandbox Code Playgroud)
我的论点是:
事实上,现在,在我的代码中,返回一个List或一些其他集合明确地认识到用户可能认为该集合是可变的并且期望能够改变它.
显然,使用不可变集合可以实现其中一些.
我的问题是:任何人都可以看到这种设计的任何缺点吗?返回一个不可变集合有什么优势Stream吗?