使用流或循环之间的决定

nar*_*oid 12 java collections loops java-8 java-stream

通过在Java中编写应用程序,有许多用例java.util.Collection.自从java.util.stream.StreamJava 8引入以来,我遇到了一些难以决定使用的用例.

例如:您将编写一些util-methods.

public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
    return toFilter.stream()
        .filter((Object o) -> hash == o.hashCode())
        .collect(Collectors.toCollection(LinkedList::new));
}
Run Code Online (Sandbox Code Playgroud)

怎么样这样写:

public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
    List<Object> result = new LinkedList<>();

    for(Object o : toFilter) {
        if(hash == o.hashCode()) {
            result.add(o);
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

两种方法都会产生相同的结果.java.util.stream.Stream并且java.util.stream.Collector是接口,因此如果我使用自定义流和收集器,实现也会有所不同.

我认为有很多实现使用旧的fashoined循环方式.

那么,是否有可能通过用例回答使用,流或循环的内容?如果是这样,是否必须在适当的时候更新所有实施?

或者我应该通过实现util-methods提供两种方式?或者我是否应该在过滤过程之后提供一个返回流的mthed,以便在需要时也可以使用该流?

Old*_*eon 9

在没有公布答案的情况下,我会引用Brian Goetz,他回应了我的情绪,我怀疑很多其他人.

关于流或循环没有任何魔力.您应该编写最易读,清晰且可维护的代码.这些都是可以接受的.


Tag*_*eev 5

请注意,在您的实现中,您坚持使用特定的结果集合类型LinkedList,与通常相比,性能通常非常差ArrayList.如果您的方法的用户想要以随机访问方式使用结果列表,该怎么办?可能此方法的用户需要一个数组,因为它应该传递给另一个接受数组的API方法.有时用户只需要知道输入集合中存在多少具有给定hashCode的对象,因此根本不需要创建结果列表.Java-8方法是从方法返回流,而不是集合,让调用者决定如何收集它:

public static <T> Stream<T> filterHashToList(int hash, Collection<T> toFilter) {
    return toFilter.stream()
        .filter(o -> hash == o.hashCode());
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

filterHashToList(42, input).count();
Run Code Online (Sandbox Code Playgroud)

要么

filterHashToList(42, input).collect(toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)

要么

filterHashToList(42, input).toArray();
Run Code Online (Sandbox Code Playgroud)

这种方法变得非常简单,所以你可能根本不需要它,但如果你想做更多的软化过滤/转换,那就没关系.

因此,如果您不想更改API并仍然返回LinkedList,则无需更改实现.但是,如果您想利用Stream API,最好将返回类型更改为Stream.