Java中Collections和Streams之间的区别

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

在本文中,我们将讨论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:**列表集合用于存储数据

  1. // Creating an ArrayList of String using
  2. List<String> fruits = new ArrayList<>();
  3. // Adding new elements to the ArrayList
  4. fruits.add("Banana");
  5. fruits.add("Apple");
  6. fruits.add("mango");
  7. fruits.add("orange");

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

  1. List<String> lines = Arrays.asList("java", "c", "python");
  2. List<String> result = lines.stream() // convert list to stream
  3. .filter(line -> !"c".equals(line)) // we dont like c
  4. .collect(Collectors.toList()); // collect the output and convert streams to a List
  5. result.forEach(System.out::println);

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

例如:

  1. // Creating an ArrayList of String using
  2. List < String > fruits = new ArrayList < > ();
  3. // Adding new elements to the ArrayList
  4. fruits.add("Banana");
  5. fruits.add("Apple");
  6. fruits.add("Mango");
  7. fruits.add("Orange");
  8. fruits.add("Pineapple");
  9. fruits.add("Grapes");
  10. System.out.println(fruits);
  11. // Remove the element at index `5`
  12. fruits.remove(5);
  13. System.out.println("After remove(5): " + fruits);

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

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

  1. // Creating an ArrayList of String using
  2. List < String > fruits = new ArrayList < > ();
  3. // Adding new elements to the ArrayList
  4. fruits.add("Banana");
  5. fruits.add("Apple");
  6. fruits.add("mango");
  7. fruits.add("orange");
  8. fruits.add("Watermelon");
  9. fruits.add("Strawberry");
  10. System.out.println("\n=== Iterate using for loop with index ===");
  11. for (int i = 0; i < fruits.size(); i++) {
  12. System.out.println(fruits.get(i));
  13. }
  14. System.out.println("=== Iterate using Java 8 forEach and lambda ===");
  15. fruits.forEach(fruit - > {
  16. System.out.println(fruit);
  17. });

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

  1. List<String> lines = Arrays.asList("java", "c", "python");
  2. List<String> result = lines.stream() // convert list to stream
  3. .filter(line -> !"c".equals(line)) // we dont like c
  4. .collect(Collectors.toList()); // collect the output and convert streams to a List
  5. result.forEach(System.out::println);

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

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

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

相关文章

最新文章

更多