Stream流 【只能使用一次,使用后就关闭了】
获取流的两种方式
1.所有Collection集合都可通过stream默认方式获取流
default Strea<E> stream ()
2.Stream接口的静态方法of可以获取对应的流。
static <T> Stream<T> of(T... values) 【参数为可变参,就可以传递一个数组】
常用方法
延迟方法:返回值类型仍然是Stream接口自身类型的方法,所以支持链式调用
Filter【过滤】Stream<T> filter(Predicate<? super T> predicate)
map【映射】<R> Stream<R> map(Function<? super T,? extends R> mapper)
Limit【截取】Stream<T> limit(long maxSize) 截取前几个
Skip【跳过】Stream<T> skip(long n) 跳过前几个
concat【组合】static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
终结方法:返回值类型不再是Stream接口自身类型的方法。
forEach【遍历】void forEach(Consumer<? super T> action)
count【统计】long count()
方法引用:【::为引用运算符,而它所在的表达式称为方法引用。如果lambda要表达的函数方案已经存在于某个方法的实现中,那么可以通过双冒号来引用该方法作为Lambda的替代者】
通过对象名来引用成员方法【对象必须存在,成员方法也要存在】
通过类名引用静态成员方法【类已经存在,静态成员方法也要存在】
通过Super引用成员方法
通过this引用本类成员方法
类的构造器引用:【类名称::new】
数组的构造器引用:【数组类型::new】(10,int[]::new)
【筛选组合eg】
package edu.xupt.test1; import java.util.ArrayList;import java.util.stream.Stream; public class Demo1 { public static void main(String[] args) { ArrayList<String> arr1 = new ArrayList<>(); arr1.add("迪丽热巴"); arr1.add("宋远桥"); arr1.add("苏星河"); arr1.add("石破天"); arr1.add("石中玉"); arr1.add("老子"); arr1.add("庄子"); arr1.add("洪七公"); Stream<String> stream1 = arr1.stream(); ArrayList<String> arr3 = new ArrayList<>(); stream1.filter(name->name.length()==3).limit(3).forEach(s ->arr3.add(s)); ArrayList<String> arr2 = new ArrayList<>(); arr2.add("古力娜扎"); arr2.add("张无忌"); arr2.add("赵丽颖"); arr2.add("张三丰"); arr2.add("尼古拉斯赵四"); arr2.add("张天爱"); arr2.add("张二狗"); Stream<String> stream2 = arr1.stream(); ArrayList<String> arr4 = new ArrayList<>(); stream2.filter(name->name.startsWith("张")).skip(2).forEach(s ->arr4.add(s)); Stream<String> concat = Stream.concat(stream1, stream2); }}
原文地址:https://www.cnblogs.com/arroa/p/12032253.html