相关疑难解决方法(0)

我应该退回收藏品还是流?

假设我有一个方法将只读视图返回到成员列表:

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中返回非惯用的流?设计的流是否始终在它们创建的同一表达式中"终止"?

java collections encapsulation java-8 java-stream

152
推荐指数
2
解决办法
3万
查看次数

返回Stream <T>的方法是否安全?

我有一种情况,我正在读取数据库并返回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 java-8 java-stream

12
推荐指数
1
解决办法
1304
查看次数

返回流而不是列表

在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)

我的论点是:

  1. 它强制执行基础列表的不变性
  2. 它隐藏的事实,有一个基础列表.稍后可以在不更改方法签名的情况下将其更改为集或其他结构.
  3. 它很好地封装了该方法的用户期望对项目做某事而不是列表.
  4. 如果需要,可以稍后平行化.

事实上,现在,在我的代码中,返回一个List或一些其他集合明确地认识到用户可能认为该集合是可变的并且期望能够改变它.

显然,使用不可变集合可以实现其中一些.

我的问题是:任何人都可以看到这种设计的任何缺点吗?返回一个不可变集合有什么优势Stream吗?

java java-8 java-stream

8
推荐指数
1
解决办法
1629
查看次数

标签 统计

java ×3

java-8 ×3

java-stream ×3

collections ×1

encapsulation ×1