Stream: 得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流.
把 集合/数组转换为流式结构,使用流中的方法进行操作.
“Stream流” 其实是一个集合元素的函数模型,其本身并不存储任何元素。
1.流式思想:
创建一个流式的模式,按照模式对数据进行操作.
2.获取流方式:
a. Stream(): 根据Collection集合获取Stream流. (所有实现类均可获取)
b.Static of(T…Values): 把一些可变参数(底层-数组) 变为Stream流.
c.Map集合也可以先把转为Set集合(keySet , entrySet) , 再用Stram操作.
3.常用方法:
- 终结方法: 返回值类型不在是Stream 例: count , forEach.
- 非终结方法: 返回值类型仍然是 Stream ,因此支持链式调用
1.forEach(Consumer<? super T> action): 对Stream流中元素进行遍历.
2.Count(): 统计元素个数 . 返回long , 终止流.
3.filter(Predicate<? super T> predicate): 对Stream流进行过滤.
4.limit(获取个数): 获取前几个.
5.skip(跳过个数): 跳过前几个.
6.map(Function <T,R> fun): 将当前流中的T类型数据转换为另一种R类型的流。
7.concat(Stream a , Stream b) : 将两个流合并为一个流.
4.收集Stream结果:
收集到集合中:
List集合: Stream.Collect(Collectors.toList()):
Set集合:Stream.Collect(Collectors . toSet( ) ):
收集到数组中:
Object[ ] obj = Stream.toArray();
转换为string[ ]数组:Stream.toArray(new String[3]);
Stream流综合案例:
/*
练习:
现在有两个ArrayList集合存储队伍当中的多个成员姓名,
1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中
2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中
3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中
4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中
5. 将两个队伍合并为一个队伍;存储到一个新集合中
6. 根据姓名创建Person对象;存储到一个新集合中
*/
public class Demo02StreamTest {
public static void main(String[] args) {
// 第一个队伍 .
List<String> one = new ArrayList<>();
one.add("迪丽热巴"); one.add("宋远桥"); one.add("苏星河");
one.add("庄子"); one.add("孙子"); one.add("洪七公");
// 1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中
// 2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中
Stream<String> stringStream = one.stream().filter(name -> name.length() == 3).limit(3);
// 第二个队伍
List<String> two = new ArrayList<>();
two.add("古力娜扎");
two.add("张无忌");
two.add("张三丰");
two.add("赵丽颖");
two.add("张二狗");
two.add("张天爱");
two.add("张三");
// 3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中
// 4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中
Stream<String> skip = two.stream().filter(name -> name.startsWith("张")).skip(2);
// 5. 将两个队伍合并为一个队伍;存储到一个新集合中
// 6. 根据姓名创建Person对象;存储到一个新集合中
// 7. 打印整个队伍的Person对象信息。
Stream.concat(stringStream,skip).map(Person::new).forEach(System.out::println);
}
}