Stream流:操作集合和数组的工具。
Stream的三类方法:
- 获取Stream流:创建一条流水线,并把数据放上去。
- 中间方法:流水线上的操作,可以进行多次操作。
- 终结方法:一个Stream流只能有一个终结方法,是流水线上的最后一个操作。
获取Stream流的方法:
集合获取Stream流的方法:
default Stream<E> stream()
获取当前集合对象的Stream流。
例:
获取Collection集合的Stream流:
Collection<String> list=new ArrayList<>();Stream<String> s=list.stream();
获取Map集合的Stream流:
Map<String,Integer> map=new HashMap<>();//键流Stream<String> s1=map.keySet().stream();//值流Stream<Integer> s2=map.values().stream();//键值对流Stream<Map.Entry<String,Integer>> s3=map.entrySet().stream();
数组获取Stream流的方法:
public static<T> Stream<T> stream(T[] array)
获取数组的stream流。
public static<T> Stream<T> of(T... Values)
获取当前数组或可变数据的stream流。
例:
1:
String[] name={“1”,”2”,”3”}Stream<String> nameStream =Arrays.stream(name);
2:
String[] name={“1”,”2”,”3”}Stream<String> nameStream =Stream.of(name);
Stream流的常用API:
中间方法:
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两个流合为一个流。
例:
List<String> list =new ArrayList<>();List.add(“杨一”);List.add(“杨二”);List.add(“张三”);List.add(“一二三”);list.stream().filter(s->s.startsWith(“杨”)).forEach(s->System.out.println(s));//输出结果:杨一 杨二long a=list.stream().filter(s->s.length()==3).count();System.out.println(a);//输出结果:1
终结方法:
void forEach(Consumer action)对此流的每个元素执行遍历操作。
long count() 返回此流中的元素数。
收集Stream流:
作用:就是把Stream流操作后得到的数据转回到数组和集合中去。
收集方法:
toArray 收集成数组,需要使用Object数组接收。
R collect(Collector collector) 开始收集Stream流,指定收集器。(收集为集合)
Collectors工具类提供的收集器方法:
public static<T> Collector toList()
把元素收集到List集合中。
public static<T> Collector toSet()
把元素收集到Set集合中。
public static Collector toMap(Function keyMapper,Funtion valueMapper)
把元素收集到Map集合中。
Map<String, CourseCategoryTreeDto> courseCategoryTreeDtoMap = courseCategoryTreeDtos.stream().filter(item -> !id.equals(item.getId())).collect(Collectors.toMap(key -> key.getId(), value -> value, (key1, key2) -> key2));//key -> key.getId() 收集到的map以id为主键//value -> value 收集到的map以原来集合中的元素为value//(key1, key2) -> key2) 当键出现重复以新添加值的为准 //如:(key1,value1)(key1,value2) 这两个元素都被stream流收集到新的map中时以 //(key1,value2)为准