Stream类【Stream流】
1、Collection集合的获取方式:
对象名.stream();
2、Map集合获取方式:
ketSet().stream();
values().stream();
entrySet().stream();
3、数组的获取方式:
Stream.of(数组名);
4、注意事项:
因为Stream类型提供的功能主要是对循环做替换,所以只有集合和数组才需要使用
public static void main(String[] args) {
//单列集合获取Stream对象
ArrayList<String > arr = new ArrayList<>();
Stream<String > s = arr.stream();
//Map集合获取Streamduix
HashMap<String, Integer> map = new HashMap<>();
Stream<String > s1 = map.keySet().stream();
Stream<Integer> s2 = map.values().stream();
Stream<Map.Entry<String ,Integer>> s3 = map.entrySet().stream();
//数组获取Stream对象
Integer[] i = new Integer[10];
Stream<Integer> s4 = Stream.of(i);
}
Stream类的常用方法
1、Stream类中包含了一些对数据过滤和筛选以及获取的方法,由此来代替循环和判断语句。
2、分类:
延迟方法:使用完该类方法之后,返回值是一个Stream类的对象,可以继续调用类 中的方法。
终结方法:使用完该类方法之后,返回值不再是一个Stream类的对象,不能继续使用 类中的方法。
方法罗列:
-
forEach(Consumer<? super T> action) :终结方法
该方法可以自动获取流中每一个数据,并对获取的数据操作
数据的操作方式根据消费型接口的实现类重写。
-
count() :返回此流中的元素数。终结方法
-
filter(Predicate<? super T> predicate) :延迟方法
该方法可以自动获取流中的每一个数据进行判断,如果数据判断结果为真,就 在流中存储,否则不存储该数据
-
limit(long m) :将流中的前m个元素保留,其余的删除 延迟方法
-
skip(long n) : 跳过前n个元素,保留后面的元素 延迟方法
-
map(Function<? super T,? extends R> mapper) :
该方法自动获取流中的每一个数据,并对数据处理,处理之后返回一个新 的数据。具体的处理方式根据实现类对象确定。
-
concat(Stream<? extends T> a, Stream<? extends T> b): 将两个流中的数据进行合并,合并为一个流对象
-
distinct():去除流中重复的元素
-
toArray():把stream流中的数据收集到数组中
-
collect(Collector c):把stream流中的数据收集到指定的集合中
Collector:参数的类型 是一个接口获取可以通过工具类Collectors的方法获取
常用:
-
获取List集合:Collectors.toList()
-
获取Set集合: Collectors.toSet()
-
案例
有两个Arraylist集合,存储队伍中的多个成员姓名,使用Stream方式,对以下步骤进行操作
1、第一个队伍只要名字为3个字的成员姓名
2、第一个队伍只要筛选之后的前三个人
3、第二个队伍只要姓张的
4、第二个队伍筛选之后不要前两个人
5、将两个队伍合并成一个队伍
6、合并之后的队伍中的所有人的Person(自定义类型)对象,存储到一个ArrayList集合中队伍1:宫本武藏、宋公明、苏有朋、石头人、时传祥、李耳、庄子、洪七公
队伍2:帕瓦罗蒂、张三疯、赵薇薇、张自忠、孛儿只斤铁木真、张天爱、张翠花
public static void main(String[] args) {
String[] s1 = "宫本武藏、宋公明、苏有朋、石头人、时传祥、李耳、庄子、洪七公".split("、");
String[] s2 = "帕瓦罗蒂、张三疯、赵薇薇、张自忠、孛儿只斤铁木真、张天爱、张翠花".split("、");
//利用 Arrays 工具类中的asList()方法把字符串切割为数组
List<String> l1 = Arrays.asList(s1);
List<String> l2 = Arrays.asList(s2);
Stream<String> str1= l1.stream();
Stream<String> str2= l2.stream();
//完成1、2、3、4步
Stream.concat(str1.filter(s -> s.length()==3).limit(3), str2.filter(s -> s.startsWith("张")).skip(2))
//利用map中的函数把字符串封装为Person对象
.map(Person::new)
//把对象转为集合
.collect(Collectors.toList())
//遍历集合
.forEach(System.out::println);
}
/*
Person{name='宋公明'}
Person{name='苏有朋'}
Person{name='石头人'}
Person{name='张天爱'}
Person{name='张翠花'}