Java8中的steram仅仅代表着数据流,与InputStream,OutPutStream是完全不同的概念。这里的stream是对集合(collection)功能的增强,更专注于对集合对象的各种便利、高效的聚合,大批量数据操作。
collec()函数
将stream返回的元素拼成ArrayList。参数为Collectros接口,提供极大的便利
<R, A> R collect(Collector<? super T,A, R> collector);
解析:函数为泛型方法
参数为泛型约束,只能是某一类型的父类
参数Colector接口
除了toList(),toSet(),toMap(),还有joing()拼接字符串,groupingby等方法
Colector方法 groupingBy基本分组
使用:我们用groupingBy方法将人群按年龄分组
Map(Integer,List<Person>)personAge=people.stream().collect(collectros.groupingBy(Person::getAge));
Person::getAge为方法引用,返回某个属性的值。这里看起来横向C++的函数作用域呀。其实groupingBy()接受一个lambda表达式
collect(Collectors.groupingBy(p->p.getAge))
gruoppingBy有多种重载,其中一个是带有收集器的,将分组的数据按指定条件收集
groupingBy 选择分组
使用:我们将分组的数据,只获取其中的名称
Map(Integer,List<string> nameofAge=people.stream().collect(groupingBy(Person::getAge,Mapping(Person::getName,toList()))); System.out.println("People grouped by age: " + nameOfPeopleByAge);
解析:两个参数:第一个是年龄,分组条件,第二个是收集期,mapping函数返回结果,mapping连个参数,分别是映射的属性和收集到的地方,如list或set
输出的结果为
People grouped byage: {35=[Greg], 20=[John], 21=[Sara, Jane]}
小结:
通过查看源码我们发现groupingBy的参数为function<T,R>函数接口,该函数的操作是接收参数为T,返回R类型的操作,说白了就是一个func的泛型委托,参数为T,返回为T,和NET中的func是一个效果,很大程度上简化了代码书写度
时间: 2024-09-29 10:09:24