目录
一.特点
1.Stream和集合的区别
Stream 关注的是数据的运算 与cpu打交道;
集合关注的是数据的存储 和内存打交道;
2.自己不会存储元素
3.不会改变源对象,且会返回一个新的Stream
4.延期执行,等结果出来才执行。
二.使用
1.实例化
List<Integer> aList= Arrays.asList(1,2,3,4);
// 1.通过集合
// 返回一个顺序流
aList.stream();
// 返回一个并行流
aList.parallelStream();
// 2.通过数组
int [] arr = new int [5];
Arrays.stream(arr);
// 3.通过of()
Stream.of(1,22,33);
// 4.创建无限流
Stream.iterate(0,t->t+2).limit(10).forEach(System.out::println);
}
2.Stream的中间操作
@Test
public void test2(){
List<Integer> aList= Arrays.asList(1,2,3,4,4);
// filter(predicate) 、接收Lambda 从流中排除某些元素
// 查询集合中>2的元素 344
aList.stream().filter(e -> e>2).forEach(System.out::print);
// limit(n) 给定元素不超过该数量
System.out.println();
aList.stream().limit(10).forEach(System.out::print);
// stream 一旦执行中止操作 gai stream就不能使用 12344
// skip(n) 跳过元素 返回一个扔掉了前n个元素的流 若流元素不足一个 则返回一个空流
System.out.println();
aList.stream().skip(1).forEach(System.out::print);//2344
// distinct() 去重
System.out.println();
aList.stream().distinct().forEach(System.out::print);//1234
}
3.map()映射
@Test
public void test3(){
List<Integer> aList1= Arrays.asList(1,2,3,4,4);
List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
// map(function f) 接收一个函数作为参数 将元素转换为其它形式或提取信息
aList2.stream().map(str -> str.toUpperCase()).forEach(System.out::print); //AABBCCDDEE
System.out.println();
List<User> users = new ArrayList<User>();
users.add(new User(5));
users.add(new User(6));
// 本来放的是user列表,映射完以后变成age列表
Stream<Integer> integerStream = users.stream().map(User::getAge);
// 岁数>2
integerStream.filter(a -> a>5).forEach(System.out::print);//6
// flatMap 和 map stream里面的stream 关系类似 add 和 addAll
}
4.排序
@Test
public void test4(){
List<Integer> aList1= Arrays.asList(1,2,3,4,4);
List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
// 自然排序 实现Comparable接口
aList2.stream().sorted().forEach(System.out::print);//aabbccddee
System.out.println();
// 定制排序
List<User> users = new ArrayList<User>();
users.add(new User(5));
users.add(new User(6));
users.stream().sorted(
(o1,o2) -> Integer.compare(o1.getAge(),o2.getAge())
).forEach(System.out::println);
// User{age=5}
// User{age=6}
}
5.终止操作
@Test
public void test5(){
List<Integer> aList1= Arrays.asList(1,2,3,4,4);
List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
List<User> users = new ArrayList<User>();
users.add(new User(5));
users.add(new User(6));
// allMatch(predicate) 判断所有元素是否都满足此断言 anyMatch(predicate) 是否有一个满足 noneMatch(predicate) 是否没有
aList1.stream().allMatch(a -> a>3 );
// 返回第一个元素 findFirst() ,findAny() 任意一个Optional(容器 解决空指针问题)
Optional<Integer> first = aList1.stream().findFirst();
System.out.println(first);
// 返回任意一个元素 findAny() Optional(容器 解决空指针问题)
Optional<Integer> findAny = aList1.stream().findAny();
System.out.println(findAny);
// 返回元素个数
long count = aList1.stream().count();
System.out.println(count);
// 返回流中最大值 max(Comparator c) 最大值 min(Comparator c)
Optional<Integer> max = users.stream().map(u -> u.getAge()).max(Integer::compare);
System.out.println(max);
}
6.归约
@Test
public void test6(){
List<Integer> aList1= Arrays.asList(1,2,3,4,4);
List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
List<User> users = new ArrayList<User>();
users.add(new User(5));
users.add(new User(6));
//reduce(T identity,BinaryOperator) 可以将流中的元素反复结合起来,得到一个值并返回
Integer sum = aList1.stream().reduce(0, Integer::sum);//14
System.out.println(sum);
// int sum(int a, int b) return a + b;
// BiFunction<T,T,T>
// 求所有用户年龄的总和
Integer sum1 = users.stream().map(User::getAge).reduce(0,Integer::sum);
// 爱能创造一切,也能毁灭一切。 认输可以输一半吗?
System.out.println(sum1);
// 11
}
7.收集
@Test
public void test7(){
List<Integer> aList1= Arrays.asList(1,2,3,4,4);
List<String> aList2= Arrays.asList("aa","bb","cc","dd","ee");
List<User> users = new ArrayList<User>();
users.add(new User(5));
users.add(new User(6));
// collect(Collector c) 将流转换为其它形式 接收一个Collector接口实现,用于给Stream中元素做汇总的方法
// 得到年龄>3的集合 Collectors.toList()
Set<User> collect = users.stream().filter(e -> e.getAge()>3).collect(Collectors.toSet());
collect.forEach(System.out::println);
//User{age=6}
//User{age=5}
}