Java 8 Stream流是一个非常强大的特性,它为Java程序员提供了一个非常便捷的方式来处理集合数据。Stream流是基于Lambda表达式和函数式编程的,它是一个可以组合操作的序列化数据流。它的执行过程分为中间操作和终端操作,中间操作返回一个新的Stream流,终端操作将返回一个非Stream的结果。在这篇攻略中,我们将详细讲解Stream流的原理和使用方法。
1. Stream流的创建
在使用Stream流前,首先要创建一个Stream。创建Stream有以下几种方式:
-
从集合中创建Stream
List<String> list = Arrays.asList("Java", "C++", "Python", "JavaScript");
Stream<String> stream1 = list.stream(); // 创建串行流
Stream<String> stream2 = list.parallelStream(); // 创建并行流 -
从数组中创建Stream
int[] nums = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(nums); -
通过Stream的of()方法创建Stream
Stream<String> stream = Stream.of("Java", "C++", "Python", "JavaScript");
2. Stream流的中间操作
Stream的中间操作支持链式调用,每次调用完中间操作后返回一个新的Stream。例如:
List<String> list = Arrays.asList("Java", "C++", "Python", "JavaScript");
Stream<String> stream = list.stream().filter(s -> s.startsWith("J")).map(String::toLowerCase).sorted();
这段代码中,我们创建了一个List集合,然后通过stream()方法创建一个Stream串行流。接着执行了三个中间操作:filter()、map()和sorted(),最后返回一个新的Stream串行流。
常见的中间操作如下:
- filter:过滤符合条件的元素
- map:将元素传递给函数处理(可以理解为转换成另一种类型)
- flatMap:将多个流进行合并
- distinct:去除重复元素
- sorted:对元素进行排序
- limit:获取指定数量的元素
- skip:跳过指定数量的元素
3. Stream流的终端操作
Stream的终端操作是最后一步操作,执行终端操作后,Stream便无法再进行操作。例如:
List<String> list = Arrays.asList("Java", "C++", "Python", "JavaScript");
long count = list.stream().filter(s -> s.startsWith("J")).count();
这段代码中,我们创建了一个List集合,然后通过stream()方法创建一个Stream串行流。接着执行了一个中间操作filter(),最后执行终端操作count(),返回一个long类型的结果。
常见的终端操作如下:
- forEach:对每个元素执行操作
- collect:将Stream转换成List、Set、Map等数据类型
- count:返回元素数量
- min、max:返回最小或最大的元素
- reduce:聚合操作
- anyMatch:判断是否有元素符合条件
- allMatch:判断是否全部元素符合条件
- noneMatch:判断是否没有元素符合条件
4. Stream流示例
以下是一个计算List集合元素平均值的示例:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
OptionalDouble average = list.stream().mapToInt(Integer::intValue).average();
System.out.println("平均值为:" + average.getAsDouble());
首先创建一个List集合,将其转换成Stream串行流。然后执行一个中间操作mapToInt(),将元素转换成int类型,再执行一个终端操作average(),求出平均值。最后通过OptionalDouble类的getAsDouble()方法获取平均值。
以下是一个根据年龄分组的示例:
// 创建Person对象
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
// 创建List集合
List<Person> personList = Arrays.asList(
new Person("张三", 18),
new Person("李四", 21),
new Person("王五", 25),
new Person("赵六", 18),
new Person("田七", 20)
);
// 根据年龄分组
Map<Integer, List<Person>> ageMap = personList.stream().collect(Collectors.groupingBy(Person::getAge));
System.out.println(ageMap);
这段代码中,我们定义了一个Person类,创建了一个List集合,并对其调用stream()方法创建Stream串行流。接着执行一个终端操作collect(),将Stream转换为Map集合,根据年龄分组。最终输出分组结果。
以上是Java 8 Stream流的介绍和使用方法。通过灵活应用Stream的中间操作和终端操作,我们可以快速完成很多集合相关的操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 8 Stream流强大的原理 - Python技术站