Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用流或循环之间的决策_Java_Loops_Collections_Java 8_Java Stream - Fatal编程技术网

Java 使用流或循环之间的决策

Java 使用流或循环之间的决策,java,loops,collections,java-8,java-stream,Java,Loops,Collections,Java 8,Java Stream,通过用Java编写应用程序,Java.util.Collection有许多用例。 由于java.util.stream.stream是在Java8中引入的,因此我遇到了一些很难决定使用什么的用例 例如: 您将要编写一些util方法 public static List<?> filterHashToList(int hash, Collection<?> toFilter) { return toFilter.stream() .filter((O

通过用Java编写应用程序,
Java.util.Collection
有许多用例。 由于
java.util.stream.stream
是在Java8中引入的,因此我遇到了一些很难决定使用什么的用例

例如: 您将要编写一些util方法

public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
    return toFilter.stream()
        .filter((Object o) -> hash == o.hashCode())
        .collect(Collectors.toCollection(LinkedList::new));
}
publicstaticlist过滤器hashtolist(int散列,集合过滤器){
返回到filter.stream()
.filter((对象o)->hash==o.hashCode())
.collect(Collectors.toCollection(LinkedList::new));
}
这样写怎么样:

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;
}
publicstaticlist过滤器hashtolist(int散列,集合过滤器){
列表结果=新建LinkedList();
用于(对象o:toFilter){
if(hash==o.hashCode()){
结果.加入(o);
}
}
返回结果;
}
这两种方法将产生相同的结果
java.util.stream.stream
java.util.stream.Collector
是接口,因此如果使用自定义流和收集器,实现也会有所不同

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

那么,是否有可能通过用例来回答使用什么,流还是循环? 如果是这样,是否所有的实现都必须在适当的地方更新

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

在没有发布答案的情况下,我将引用与我的观点相呼应的人的话,我怀疑还有很多其他人


无论是流还是环,都没有什么神奇之处。您应该编写可读性、清晰性和可维护性最好的代码。这些都是可以接受的


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

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

这样,方法变得非常简单,因此您可能根本不需要它,但是如果您想进行更多的模拟过滤/转换,则可以


因此,如果您不想更改API并且仍然返回
LinkedList
,则无需更改实现。但是,如果您想利用使用流API的优势,最好将返回类型更改为
Stream
,我认为这在很大程度上取决于集合的预期大小和程序的实际应用。前者的效率稍高一些,但我发现可读性较差,而且仍有一些系统运行在Java7(即Google App Engine)上。此外,后者可能更容易添加更复杂的过滤器。但是,如果效率是首要考虑的问题,我会选择前者。

我会使用两个简单的规则:1。如果它没有坏,就不要修理它。2.使用您认为最具可读性和可维护性的内容。也就是说,您的两个示例并没有返回相同的内容:一个返回ArrayList,另一个返回LinkedList。流或循环都没有什么神奇之处。您应该编写可读性、清晰性和可维护性最好的代码。这些都是可以接受的。(请注意,如果LinkedList确实是您想要的,您可能希望在第一个示例中使用toCollection(LinkedList::New)。@jbnize不同意,除非您不能指望toList()返回ArrayList。“它返回一个列表——这就是你所知道的一切。”布里安戈兹同意。请告诉我,你实际上不打算在将来返回LinkedList:-)@JBNizet说了一切:如果它有效,就不要修复它。然而,出于好奇,为什么要使用LinkedList呢?因为您返回了一个列表,所以无论如何,您都无法访问LinkedList特定的任何方法,而ArrayList总体性能更好。。。
filterHashToList(42, input).count();
filterHashToList(42, input).collect(toCollection(ArrayList::new));
filterHashToList(42, input).toArray();