愿天堂没有Java之Stream流
目录
JavaSE 笔记(五)
Java 是一门非常严谨的语言
Stream 流概述
认识一下嘛
- 得益于 Lambda 所带来的函数式编程,出现了 Stream 流的概念
- 用于简化集合和数组操作的 API
思想
- 先得到集合或者数组的 Stream 流
- 将元素放在上面
- 用 Stream 流简化的方式来方便的操作元素
流的三类方法
- 获取流:创建一条流水线,并把数据放在流水线上操作
- 中间方法:一次操作完成之后,还可以继续其他操作
- 终结方法:一个流只能有一个终结方法,是流水线上的最后一个操作
流的获取
集合获取流
-
使用 Collection 接口中的默认方法
名称 说明 default Stream<E> stream()
获取当前集合对象的Stream流 -
用例
1 2 3 4 5 6 7 8 9
// Collection集合获取流 Collection<String> list = new ArrayList<>(); Stream<String> s = list.stream(); // Map集合获取流 Map<String, Integer> maps = new HashMap<>(); Stream<String> keyStream = maps.keySet().stream(); // 键流 Stream<Integer> valueStream = maps.values().stream(); // 值流 Stream<Map.Entry<String,Integer>> keyAndValueStream = maps.entrySet().stream(); // 键值对流(拿整体)
数组获取流
-
用到的方法
名称 说明 public static <T> Stream<T> stream(T[] array)
获取当前数组的Stream流 public static<T> Stream<T> of(T... values)
获取当前数组/可变数据的Stream流 -
用例
1 2 3
String[] names = {"Poria","Pupi1"}; Stream<String> nameStream1 = Arrays.stream(names); Stream<String> nameStream2 = Stream.of(names);
流的中间方法
常用方法
名称 | 说明 |
---|---|
Stream<T> filter(Predicate<? super T> predicate) |
用于对流中的数据进行过滤。 |
Stream<T> limit(long maxSize) |
获取前几个元素 |
Stream<T> skip(long n) |
跳过前几个元素 |
Stream<T> distinct() |
去除流中重复的元素。依赖(hashCode和equals方法) |
static <T> Stream<T> concat(Stream a, Stream b) |
合并a和b两个流为一个流 |
注意事项
- 中间方法也称非终结方法,调用完成之后返回新的流可以继续使用,支持链式编程
- 在流中无法直接修改集合、数组中的数据
流的终结方法
常用方法
名称 | 说明 |
---|---|
void forEach(Consumer action) |
对此流的每个元素执行遍历操作 |
long count() |
返回此流中的元素数 |
注意事项
- 调用之后无法继续使用流了,因为这些方法不会返回流
流的收集
认识一下嘛
- 把流操作后的结果数据转回到集合或者数组中去
- 流只是方便操作集合/数组的手段,集合/数组才是开发中的目的
收集方法
名称 | 说明 |
---|---|
R collect(Collector collector) |
开始收集Stream流,指定收集器 |
Collectors 工具类中提供了具体的收集方法
名称 | 说明 |
---|---|
public static <T> Collector toList() |
把元素收集到List集合中 |
public static <T> Collector toSet() |
把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper , Function valueMapper) |
把元素收集到Map集合中 |