什么是Java8 Stream流?
Java8 Stream流是一个在集合或数组上执行数据处理操作的API。它提供了一种更简洁、更具可读性的方式来编写高效的数据处理代码。Stream流支持串行和并行两种模式,让我们轻松地利用多核处理器的优势来处理大量的数据。
初始化数据
@Data
public class Person {
/**
* 年龄
*/
private Integer age;
/**
* 名称
*/
private String name;
/**
* 城市
*/
private String city;
}
List<String> nameList = Stream.of("彬蔚", "彬彬", "博裕", "博闻", "瑜昕", "槿玥", "妙桐", "莹然", "夕纯", "思羽", "溪瑶", "羽慕","瑾语","娴静", "焓艳","涵芯" , "语程","茹馨","雅舒","芹柔","寒凝")
.collect(Collectors.toList());
List<String> cityList = Stream.of("北京", "上海", "广州", "深圳")
.collect(Collectors.toList());
for (int i = 0; i < 20; i++) {
Person person = new Person();
person.setAge(i*3);
person.setName(nameList.get(i));
person.setCity(cityList.get(ThreadLocalRandom.current().nextInt(cityList.size())));
personList.add(person);
}
Stream流常见操作
过滤操作
过滤操作可以从集合中选择所需的元素。例如,我们可以使用filter()方法筛选出大于等于40岁的人:
List<Person> filteredPersons = personList.stream()
.filter(p -> p.getAge() >= 40)
.collect(Collectors.toList());
System.out.println(filteredPersons);
//输出
//[Person(age=42, name=焓艳, city=上海), Person(age=45, name=涵芯, city=广州), Person(age=48, name=语程, city=深圳), Person(age=51, name=茹馨, city=深圳), Person(age=54, name=雅舒, city=北京), Person(age=57, name=芹柔, city=上海)]
映射操作
映射操作可以将一个元素列表转换成另一个元素列表。例如,我们可以使用map()方法将字符串列表转换为它们的长度列表:
List<String> strings = Stream.of("北京市", "四川成都", "高新", "京").collect(Collectors.toList());
List<Integer> lengths = strings.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths);
//输出
//[3, 4, 2, 1]
排序操作
排序操作可以按照指定的顺序对元素进行排序。例如,我们可以使用sorted()方法按年龄对人进行排序:默认升序
List<Person> sortedPersons = personList.stream()
.sorted(Comparator.comparing(Person::getAge))
.collect(Collectors.toList());
System.out.println(sortedPersons);
//输出
//[Person(age=0, name=彬蔚, city=深圳), Person(age=3, name=彬彬, city=深圳), Person(age=6, name=博裕, city=深圳), Person(age=9, name=博闻, city=北京), Person(age=12, name=瑜昕, city=上海), Person(age=15, name=槿玥, city=广州)...]
归约操作
归约操作可以将元素列表转换为单个值。例如,我们可以使用reduce()方法将数字列表中的所有数字相加:
List<Integer> numbers = Stream.of(1,5,7,9).collect(Collectors.toList());
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum);
//输出
//22
收集操作
收集操作可以将结果收集到一个集合中。例如,我们可以使用collect()方法将人列表分组并按城市进行分组:
Map<String, List<Person>> personsByCity = personList.stream()
.collect(Collectors.groupingBy(Person::getCity));
System.out.println(personsByCity);
//输出
//{上海=[Person(age=6, name=博裕, city=上海), Person(age=9, name=博闻, city=上海), Person(age=12, name=瑜昕, city=上海), Person(age=15, name=槿玥, city=上海), Person(age=18, name=妙桐, city=上海), Person(age=27, name=思羽, city=上海), Person(age=30, name=溪瑶, city=上海), Person(age=42, name=焓艳, city=上海), Person(age=51, name=茹馨, city=上海), Person(age=57, name=芹柔, city=上海)], 广州=[Person(age=0, name=彬蔚, city=广州), Person(age=21, name=莹然, city=广州), Person(age=33, name=羽慕, city=广州)], 北京=[Person(age=36, name=瑾语, city=北京), Person(age=39, name=娴静, city=北京), Person(age=54, name=雅舒, city=北京)], 深圳=[Person(age=3, name=彬彬, city=深圳), Person(age=24, name=夕纯, city=深圳), Person(age=45, name=涵芯, city=深圳), Person(age=48, name=语程, city=深圳)]}
Stream流并行处理
Java8 Stream流可以通过parallelStream()方法启用并行处理,使我们能够轻松地利用多核处理器的优势,并快速处理大量数据。例如,对于非常大的数字列表,我们可以使用parallelStream()方法将其分成几个部分并并行处理它们:
List<Integer> numbers = Stream.of(4545,45,131,44,643,13,458,41,46,45,13146,131,4,31,34,4,1348,45,46).collect(Collectors.toList());
int sum = numbers.parallelStream()
.reduce(0, Integer::sum);
System.out.println(sum);
//输出
//20800
总结
Java8 Stream流提供了一种更加简洁和易于理解的方式来编写高效的数据处理代码。Stream流支持串行和并行两种模式,让我们可以轻松地利用多核处理器的优势来处理大量的数据。希望本文能够帮助你更好地了解Java8 Stream流及其应用。