Java中Collections和Streams之间的区别

x33g5p2x  于2022-10-14 转载在 Java  
字(2.9k)|赞(0)|评价(0)|浏览(385)

在本文中,我们将讨论Java中Collections和Streams之间的区别。
学习并掌握Java Collections Framework,网址为https://www.javaguides.net/p/java-collections-tutorial.html

Java中的集合与流

以下是Java中Collections和Streams之间差异的总结:

让我们用一个例子来理解每个差异。

1.集合用于在特定数据结构(如列表、集合或Map)中存储和分组数据。而Streams用于对存储的数据(如数组、集合或I/O资源)执行复杂的数据处理操作,如筛选、匹配、Map等
这意味着,集合主要是关于数据的,流主要是关于对数据的操作
**示例1:**列表集合用于存储数据

// Creating an ArrayList of String using
     List<String> fruits = new ArrayList<>();
     // Adding new elements to the ArrayList
     fruits.add("Banana");
     fruits.add("Apple");
     fruits.add("mango");
     fruits.add("orange");

**示例2:**流用于执行筛选、Map、收集结果等操作:

List<String> lines = Arrays.asList("java", "c", "python");

        List<String> result = lines.stream()       // convert list to stream
                .filter(line -> !"c".equals(line)) // we dont like c
                .collect(Collectors.toList());     // collect the output and convert streams to a List

        result.forEach(System.out::println);

2.可以在集合中添加或删除元素。但是,您不能在流中添加或删除元素。流使用源,对其执行操作,并返回结果。他们甚至不会修改源代码

例如:

// Creating an ArrayList of String using
        List < String > fruits = new ArrayList < > ();
        // Adding new elements to the ArrayList
        fruits.add("Banana");
        fruits.add("Apple");
        fruits.add("Mango");
        fruits.add("Orange");
        fruits.add("Pineapple");
        fruits.add("Grapes");

        System.out.println(fruits);

        // Remove the element at index `5`
        fruits.remove(5);
        System.out.println("After remove(5): " + fruits);

在Streams中,没有这样的方法来添加或删除元素。

3.流在后台为我们执行内部迭代(使用forEach()方法)。我们只需要提到要在源上执行的操作。另一方面,我们必须使用循环在外部对集合进行迭代
**示例1:**使用for循环的Collections的外部迭代

// Creating an ArrayList of String using
List < String > fruits = new ArrayList < > ();
// Adding new elements to the ArrayList
fruits.add("Banana");
fruits.add("Apple");
fruits.add("mango");
fruits.add("orange");
fruits.add("Watermelon");
fruits.add("Strawberry");

System.out.println("\n=== Iterate using for loop with index ===");
for (int i = 0; i < fruits.size(); i++) {
    System.out.println(fruits.get(i));
}

System.out.println("=== Iterate using Java 8 forEach and lambda ===");
fruits.forEach(fruit - > {
    System.out.println(fruit);
});

示例2:Streams的内部迭代。循环不再需要:

List<String> lines = Arrays.asList("java", "c", "python");

        List<String> result = lines.stream()       // convert list to stream
                .filter(line -> !"c".equals(line)) // we dont like c
                .collect(Collectors.toList());     // collect the output and convert streams to a List

        result.forEach(System.out::println);

4.流只能遍历一次。如果您遍历流一次,则称其已被消耗。要再次遍历它,必须再次从源获取新流。但是,可以多次遍历集合

List<Integer> numbers = Arrays.asList(4, 2, 8, 9, 5, 6, 7);
         
Stream<Integer> numbersGreaterThan5 = numbers.stream().filter(i -> i > 5);
         
//Traversing numbersGreaterThan5 stream first time
         
numbersGreaterThan5.forEach(System.out::println);
         
//Second time traversal will throw error
         
//Error : stream has already been operated upon or closed
         
numbersGreaterThan5.forEach(System.out::println);

5.集合是急切构建的,即所有元素都是在开始时计算的。但是,流是延迟构造的,即在调用终端操作之前不会评估中间操作

相关文章

微信公众号

最新文章

更多