在本文中,我们将讨论Java中Collections和Streams之间的区别。
学习并掌握Java Collections Framework,网址为https://www.javaguides.net/p/java-collections-tutorial.html
以下是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.集合是急切构建的,即所有元素都是在开始时计算的。但是,流是延迟构造的,即在调用终端操作之前不会评估中间操作
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.javaguides.net/2021/12/collections-vs-streams-in-java.html
内容来源于网络,如有侵权,请联系作者删除!