Stream 流的三类方法
获取Stream 流
创建一条流水线,并把数据放到流水线上准备操作
中间方法
流水线上的操作
一次操作完毕之后,还可以继续进行其他操作
终结方法
一个Stream流只能有一个终结方法
是流水线上的最后一个操作
单列集合:集合对象.stream();
双列集合:不能直接获取,需要间接获取
集合对象.keySet().stream() 获取键的集合的Stream流
集合对象.entrySet().stream 获取键值对的集合 的Stream流
数组: Arrays.stream(数组名);
同种数据类型的多个数据:stream.of(数据1,数据2,数据3.......)
中间方法
1 .filter() 获取流中的每一个数据,test方法中的s就以此表示流中的每一个数据,只要在test方法中对s进行判断就可以了
list.stream().filter()
HashMap<String,String> map =new HashMap<>(); map.put("张三","浙江"); map.put("李四","四川"); map.put("王五","福建"); map.put("张飞","福建"); map.keySet().stream().filter(new Predicate<String>() { @Override public boolean test(String s) { return s.startsWith("张");//判断是否以张开头 如果是true则留下 } }).forEach(s-> System.out.println(s+map.get(s))); //打印所有姓张的键跟对应的值
而Predicate接口只有一个test抽象方法所以 可以用简略版lambda表达式:
map.keySet().stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
Stream<T> limit(long maxSize):截取指定参数个数的数据
Stream<T> skip(long n):跳过指定参数个数的数据
static <T> Stream<T> concat(Stream a, Stream b):合并a和b两个流为一个流
Stream<T> distinct():去除流中重复的元素。依赖(hashCode和equals方法)
终结操作方法
forEach() 对此流的每个元素执行操作
void forEach(Consumer action):对此流的每个元素执行操作 Consumer接口中的方法 void accept(T t):对给定的参数执行此操作
底层是循环获取流中的每个数据,并循环调用accept方法,并把每一个数据传递给accept方法,s就代表了流中的每个数据
可以用Lambda表达式简写
list.stream().forEach(s -> System.out.println(s))
long count():返回此流中的元素数
Stream流中无法直接修改集合,数组等数据源中的数据
Stream流的收集操作 ,在用stream流的方式操作完之后,我想把流中数据存起来 该怎么办?
Stream流的收集方法 R collect(Collector collector)
工具类Collectors提供了具体的收集方式
public static <T> Collector toList():把元素收集到List集合中
public static <T> Collector toSet():把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中