一文带你掌握Java8强大的StreamAPI - 完整攻略
什么是StreamAPI?
Java 8引入了Stream API,这是一种处理数据流的新方式,通过Stream API可以执行流式处理,在Java 8之前,我们处理集合需要使用for循环或者迭代器等方式,而这些处理方式会让代码变得复杂难懂,使用Stream API,我们可以更加简洁高效的处理数据流。
Stream API的主要特点如下:
- 流式处理,可以对数据流进行转换、筛选等操作。
- 延迟执行,只有在需要获取结果时才会进行计算,可以减少不必要的计算。
- 并行处理,可以使用多线程进行并行计算,提高处理速度。
Stream API常用方法
创建Stream
Java 8中的集合类都添加了两个方法:Stream和parallelStream,用于生成一个普通流或者并行流。
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取普通流
Stream<String> parallelStream = list.parallelStream(); //获取并行流
筛选和切片
- filter:通过过滤得到符合条件的元素。
- limit:截断流,使其元素不超过给定数量。
- skip:跳过指定数量的元素。
- distinct:去重。
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//获取偶数
List<Integer> evens = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
//获取前三个偶数
List<Integer> first3Evens = list.stream().filter(n -> n % 2 == 0).limit(3).collect(Collectors.toList());
//获取跳过前两个元素的流并去重
Stream<Integer> distinctStream = list.stream().skip(2).distinct();
映射
- map:将流中的每一个元素都进行一定的操作后转换成另一个元素。
- flatMap:扁平化处理,将多个流合并成一个流。
List<String> words = Arrays.asList("hello", "world");
//获取每个单词的长度,并转化为List类型
List<Integer> wordLengths = words.stream().map(String::length).collect(Collectors.toList());
List<String> list1 = Arrays.asList("hello", "world");
List<String> list2 = Arrays.asList("java", "stream");
//将两个list合并成一个新的list
List<String> mergedList = Stream.of(list1, list2).flatMap(Collection::stream).collect(Collectors.toList());
归约
- reduce:将流中的元素反复结合得到一个值。
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//获取所有元素的和
int sum = list.stream().reduce(0, Integer::sum);
示例1 - 求出单词长度小于5的单词数
List<String> words = Arrays.asList("hello", "world", "java", "stream", "lambda", "was", "is");
//求出单词长度小于5的单词数
long count = words.stream()
.filter(s -> s.length() < 5)
.count();
示例2 - 获取每个人年龄最大的用户
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
//getter、setter方法
}
List<User> userList = Arrays.asList(new User("Tom", 25),
new User("Jack", 26),
new User("Lucy", 27),
new User("Lily", 23),
new User("David", 28));
//获取每个人年龄最大的用户
Map<String, Integer> nameAndAgeMap = userList
.stream()
.collect(Collectors.toMap(User::getName, User::getAge, Integer::max));
以上就是Java8 StreamAPI的完整攻略,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你掌握Java8强大的StreamAPI - Python技术站