一,Stream流式处理:
- Stream流式处理是建立在lambda基础上的多数据处理技术
- stream对集合数据处理进行高度抽象,极大简化代码量
- stream可对集合进行迭代,去重,筛选,排序,聚合等一系列处理
二,Stream流的五种创建方式
PS:前两个最常用,后面的做了解即可
// 基于数组进行创建
@Test
public void generator1() {
String[] str = {"lucy", "lily", "jack"};
Stream<String> stream = Stream.of(str);
stream.forEach(s -> System.out.println(s));
}
// 基于集合进行创建
@Test
public void generator2() {
List<String> list = new ArrayList<>();
list.add("lucy");
list.add("Lily");
list.add("jack");
Stream<String> stream = list.stream();
stream.forEach(s -> System.out.println(s));
}
// 利用generator方法创建无线长度流
@Test
public void generator3() {
Stream<Integer> stream = Stream.generate(() -> new Random().nextInt(1000));
// 持续进行输出
// stream.forEach(i -> System.out.println(i));
// 加上limit做限制以后,输出个数为limit参数设置的长度
stream.limit(10).forEach(i -> System.out.println(i));
}
//基于迭代器创建流
@Test
public void generator4() {
Stream<Integer> stream = Stream.iterate(1, n -> n + 1);
// 持续进行输出
// stream.forEach(i -> System.out.println(i));
// 加上limit做限制以后,输出个数为limit参数设置的长度
stream.limit(10).forEach(i -> System.out.println(i));
}
// 基于字符序列创建流
@Test
public void generator5() {
String str = "abcdefg";
IntStream stream = str.chars();
// 输出的整数是字符的ASCII码,如果需要转换成中文,可以加上charAt
// stream.forEach(i -> System.out.println(i));
stream.forEach(i -> System.out.println((char) i));
}
三,常用方法:
接口 | 用途 |
---|---|
foreach | 循环遍历 |
map | map方法用于映射每一个元素到对应的结果 |
filter | filter方法用于通过设置的条件过滤出元素 |
limit | limit方法用于获取指定数量的流 |
sorted | sorted方法用于对流进行排序 |
Collectors | Collectors类实现将流转换为集合和聚合元素 |
// 提取集合中所有偶数的和
@Test
public void demo1() {
List<String> list = Arrays.asList("1", "2", "3", "4", "5", "6");
int sum = list.stream()
.mapToInt(n -> Integer.parseInt(n))//转为整型数组
.filter(n -> n % 2 == 0) // 过滤器,过滤到无用的数字
.sum(); // 求和
System.out.println(sum);
}
// 所有名字首字母大写
@Test
public void demo2() {
List<String> list = Arrays.asList("lucy", "lily", "jack", "lucy");
List newList = list.stream()
.map(s -> s.substring(0, 1).toUpperCase() + s.substring(1)) //按规则对每一个流数据进行转换
.collect(Collectors.toList());// collect对数据进行收集,转为list数组,如需过滤重复,可以用set方法,如下
System.out.println(newList);
}
@Test
public void demo3() {
List<String> list = Arrays.asList("lucy", "lily", "jack", "lucy");
Set newSet = list.stream()
.map(s -> s.substring(0, 1).toUpperCase() + s.substring(1))
.collect(Collectors.toSet());
System.out.println(newSet);
}
// 将所有奇数进行从大到小的排序,且不允许重复
@Test
public void demo4() {
List<Integer> list = Arrays.asList(100, 31, 35, 13, 31, 100, 23);
List newList = list.stream()
.distinct() //去重
.filter(s -> s % 2 == 1) // 求奇数
.sorted((a, b) -> b - a) // 从大到小进行排序,A代表前一个数据,b代表后一个数据,b-a表示数据从大到小进行排列
.collect(Collectors.toList()); // 转换成集合
System.out.println(newList);
}