Stream流:可理解为一条流水线作业,期间要经过一些处理步骤后得到最终结果。它将函数式风格引入Java中。
范例:
/**
* 案例:
* 创建一个集合,存储多个字符串元素
* 把集合中所有以"张"开头的元素存储到一个新的集合
* 把"张"开头的集合中的长度为3的元素存储到一个新的集合
* 遍历上一步得到的集合
*/
public static void main(String[] args) {
// 普通方式编写的代码量很大,若再增加几个判断又得添加一堆代码
ArrayList<String> list = new ArrayList<>();
list.add("爱丽丝");
list.add("张力");
list.add("是多少");
list.add("张望着");
list.add("地位");
ArrayList<String> zhangList = new ArrayList<>();
for(String s : list) {
if (s.startsWith("张")) {
zhangList.add(s);
}
}
// System.out.println(zhangList);
ArrayList<String> threeList = new ArrayList<>();
for(String ss : zhangList) {
if (ss.length() == 3) {
threeList.add(ss);
}
}
System.out.println(threeList);
// Stream流的方式来处理这个问题,逻辑简单且清晰,就是一条流水线
list.stream().filter(s -> s.startsWith("张")).filter(ss->ss.length()==3).forEach(sss-> System.out.println(sss));
Stream流的使用:
Stream流的生成方式:
Stream流的常见中间操作方法:
Stream<T> limit(long maxSizee):返回流中的指定的截取长度为maxSizee的数据。
Stream<T> skip(long n):跳过指定的长度为n的数据,返回剩下的数据组成的流。
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b):将a和b两个流合并为一个流。
Stream<T> distinct():返回元素去重后的流(底层式根据Object.equals(Object)的方法)
Stream<T> sorted():流元素根据自然顺序排序。
Stream<T> sorted(Comparator c):流元素根据比较器Comparator进行排序。
Stream map(Function mapper):返回由给定函数应用于此流的元素的结果组成的流。
IntStream mapToInt(ToIntFunction mapper):返回一个IntStream其中包含将给定函数应用于此流的元素的结果。
Stream流的常见终结操作方法:
void forEach(Consumer action):对此流的每个元素执行操作。
long count():返回此流中的元素数 。
Stream流的收集操作:主要是为了把流的数据收集到集合中的操作。
范例: