3.Stream流
JDK1.8后出现的,用于解决集合和数组现有的弊端。
关注做什么而不是怎么做
stream并不存储元素,而是按需计算
两个特性:
1. pipelining(只能被消费一次)
2. 内部迭代
3.1 获取Stream
* 所有的Collection可以通过stream默认方法
* Stream接口的of方法
// 1.集合转换为Stream
list<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
Set<String> set = new HashSet<>();
Stream<String> stream2 = set.stream();
// 2.Map转换为Stream
Map<String,String> map = new HashMap<>();
Set<String> keySet = map.keySet();
Stream<String> stream3 = keySet.stream();
Collection<String> values = may.values();
Stream<String> stream4 = values.stream();
// 获取键值对的映射关系
Set<Map.Entry<String,String>> entries = may.entrySet();
Stream<Map.Entry<String,String>> stream5 = entries.stream();
// 数组转换为Stream流
Stream<Integer> stream6 = Stream.of(1,2,3,4);
Integer[] arr = {1,2,3,4};
Stream<Integer> stream7 = Stream.of(arr);
3.2 Stream流中常用的方法
* 延迟方法:返回值仍是Stream接口自身类型,支持链式编程
* 终结方法:返回值不再是Stream接口自身的类型,其后不支持链式,有两个:
1. count
2. forEach
3.2.1 forEach
void forEach(Consumer<? super T> action)
该方法接收一个Consumer接口,可以传递Lambad表达式来消费数据
终结方法,一般用来遍历数据
Stream<String> stream = Stream.of("zhangsan", "wamgwi", "jajaj");
stream.forEach((name)-> System.out.println(name)); // 被消费后关闭,不能再调用
3.2.2 filter
Stream<T> filter(Predicate<? super T> predicate)
可以将一个流转换为另一个子集流,接收一个Predicate函数式接口作为筛选条件
结果为true,filter方法会将元素留下;结果为false,元素将被舍去
Stream<String> stream1 = Stream.of("zhang", "wang", "zhang1", "ahhaha");
Stream<String> stream2 = stream1.filter((name) -> name.startsWith("zh"));
3.2.3 map
<R> Stream<R> map(Function<? super T,? extends R> mapper)
将流中的元素映射到另一个流中,接收一个Function函数接口
Stream<String> stream3 = Stream.of("1", "2", "3", "4");
Stream<Integer> stream4 = stream3.map((s) -> Integer.parseInt(s));
stream4.forEach(i-> System.out.println(i)); // 被消费后关闭,不能再调用
3.2.4 count
long count()
统计元素的个数,终结方法
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Stream<Integer> stream5 = list.stream();
long count = stream5.count();
System.out.println(count);
3.2.5 limit
Stream<T> limit(long maxSize)
对流进行截取,只取前n个
3.2.6 skip
Stream<T> skip(long skipnum)
跳过前n个元素