Stream流
作用:结合lamada表达式,简化集合、数组的操作
操作步骤
1、获取Stream流
- 单列集合 ⭐️
- Collection中的默认方法
- 双列集合 ⭐️
- 无法直接使用,需要配合keyset、entryset
- 数组
- Arrays.stream(arr)
- 零散数据
- 需要同种数据类型
- Stream.of()
2、中间方法
- filter:过滤 ⭐️
- limit:取元素 ⭐️
- skip:略过元素
- distinct:依赖hashCode和equals方法
- concat:合并流
- map:转换流中的数据类型 ⭐️
3、终结方法
- foreach(Consumer action):遍历
- count:统计
- toArray:收集流中的数据放到数组中
- collect(Collector collector) 收集流中的数据,放到集合中⭐️
tips:
- 获取stream流时,如果是数组,可以使用Stream.of()静态方法,也可以使用Arrays.stream(),但是如果数组元素是基本数据类型,则静态方法会把数据当成一个可变参数执行
- 修改了Stream流中的数据,不会影响原来的数据
- collect收集map的时候,键不能重复
练习:
- 数据过滤:集合1~10,过滤奇数,只留下偶数,将结果保存
java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class Demo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> collect = list.stream()
.filter(item -> item % 2 == 0)
.collect(Collectors.toList());
}
}
- 字符串过滤并收集:arraylist集合,添加"zhangsan,23", "lisi, 4", "wangwu, 25" 保留年龄大于24岁的人,并将结果收集到Map集合中,其中姓名为键,年龄为值
java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Collections.addAll(list, "zhangsan,23", "lisi,24", "wangwu,25");
Map<String, String> map = list.stream()
.filter(item -> Integer.parseInt(item.split(",")[1]) >= 24)
.collect(Collectors.toMap(item -> item.split(",")[0], item -> item.split(",")[1]));
System.out.println(map);
}
}
- 自定义对象过滤并收集:两个arraylist集合,第一个集合存储6名男演员的姓名和年龄;第二个集合中存储6名女演员的名字和年龄;中间用逗号分隔 -> 张三,23;-> 完成1.男演员只要名字为3个字的前两人;2.女演员只要姓杨的,并且不要第一个;3.把过滤后的男演员姓名和女演员姓名合并到一起;4.将上一步的演员星系封装成Actor对象;5.将所有的演员对象都保存到List集合中
java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Demo {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
Collections.addAll(list1, "蔡坤坤,24", "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");
Collections.addAll(list2, "赵小颖,35", "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33");
// 第一个
Stream<String> stream1 = list1.stream()
.filter(s -> s.split(",")[0].length() == 3)
.limit(2);
// 第二个
Stream<String> stream2 = list2.stream()
.filter(s -> s.startsWith("杨"))
.skip(1);
// 第三个
Stream<String> stream = Stream.concat(stream1, stream2);
// 第四个、第五个
List<Actor> actors = stream.map(item -> new Actor(item.split(",")[0], Integer.parseInt(item.split(",")[1]))).collect(Collectors.toList());
System.out.println(actors);
}
}
class Actor {
private String name;
private Integer age;
public Actor(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Actor{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}