Stream流
目的:用于简化集合和数组操作的API
例子:将姓名中姓张的,并且为3个子的人的名字输出
names.stream().filter(s->s.startswith("张")).filter(s->s.length()==3).forEach(s->system.out.println(s));
-
stream流的作用是什么,结合了什么技术?
简化集合,数组操作的API,结合了Lambda表达式
-
stream流的思想和使用步骤?
- 先得到集合或者数组的stream流
- 把元素放上去
- 用这个stream流简化的API来操作元素
Stream流的三类方法:
- 获取stream流
- 创建一条流水线,并把数据放到流水线上准备进行操作
- 中间方法
- 流水线上的操作,一次操作完毕之后,还可以继续进行其他操作
- 终结方法
- 一个stream流只能有一个终结方法,是流水线上的最后一个操作
stream操作集合或者数组的第一步是先得到stream流,然后才能使用流的功能。
集合获取stream流的方式
- 获取当前数组的stream流
public static<T> stream<T> stream(T[] array);
- 获取当前数组、可变数据的stream流
public static<T> stream<T> of(T...value);
- Collection集合获取流
Collection<String> list =new ArrayList<>();
Stream<String> s=list.stream();
- Map集合获取流(需要获取键值对的值再调用流)
//键流
Map<String,Integer> maps=new HashMap<>();
Stream<String> keyStream=maps.keyset().stream();
//值流
Stream<Integer> valuestream=maps.values().stream();
//键值对流
Stream<Map.entry<String,Integer>> keyAndValueStream=maps.entrySet().Stream();
- 数组获取流(要注意)
String[] names={"","","",""};
Stream<String> nameStream=Arrays.stream(names);
Stream<String> nameStream2=Stream.of(names);
FIlter过滤元素
list.stream().filter(s->s.startswith("张"));
count统计个数
long size=list.stream().filter(s->s.length()==3).count();
limit:取前几个元素
list.stream().filter(s->startwith("张")).limit(2).forEach(s->s=System.out.println(s));
list.stream().filter(s->startwith("张")).limit(2).forEach(s->s=System.out::print(n);
skip:跳过前几个
list.stream().filter(s->s.startwith("张")).skip(2).forEach(System.out::print(n))
map:加工方法
//例子:给集合元素的前面都加上一个:Double
list.stream().map(new Function<String,String>(){
@Override
public String apply(String s){
return "Double"+s;
}
});
list.stream().map(s->"Double"+s);
//把所有的名称,都加工成一个学生对象
list.stream().map(s->new Student(s)).forEach(s->System.out.println(s));
list.stream().map(Student::new).forEach(s->System.out::print(s));
concat:合并流
Stream<String> s1=list.stream.filter(s->s.StartsWith("张"));
Stream<String> s2=Stream.of("java1","java2");
Stream<String> s3=Stream.concat(s1,s2);
s3.forEach(s->System.out.println(s));
distinct():去重复
s3.distinct();
- 中间方法也称为非终结方法调用完成后返回新的stream流可以继续使用,支持链式编程
- 在Stream流中无法直接修改集合,数组中的数据。
终结操作方法:
forEach():对流的遍历操作
count():返回流中的元素数
终结方法后流不可以继续使用非终结方法会返回新的流,支持链式编程
.get():获取值
.max():找最大值
.sorted():排序
//最高工资(开发部)
Topperformer t=one.stream().max((e1,e2)->Double.compare(e1.getSalary()+e1.getBonus(),e2.getSalary()+e2.getBonus()).map(e->new TopperFormer(e.getName(),e.getSalary()+e.getBonus())).get();
//统计平均工资,去掉最高工资和最低工资
one.Stream().sorted(e1,e2)->Double.compare(e1.getSalary()+e1.getBinus(),e2.getSalary()+e2.getBons()).skip().limit(one.size()-2).forEach(e->allMoney+=(e.getSalary()+e.getBones());)
在类中定义
public static double allMoney;
BigDecimal a=BigDecimal.valueof(allMoney2);
BigDecimal b=BigDecimal.valueof(one.size()+twoSize()-2);
System.out.println(""+a.divide(b,2,RoundingModle.HALF_UP));
Stream流的收集操作
-
收集Stream流的含义:把Stream流操作后的结果数据转回到集合或者数组中去
-
Stream流:方便操作集合/数组的手段
-
集合/数组:才是开发的目的
-
Stream流的收集方法:
-
R collect(collector collector);//开发收集Stream流,指定收集器
-
-
Collectors工具类提供了具体的收集方式
-
public static <T>collector toList()//把元素收集到List集合中 public static <T> collector toSet()//把元素收集到Set集合中 public static collector to map(Function keyMapper,Function valueMappper)//把元素收集到Map集合中
-
-
将流转成ArrayList
-
Stream<String> s1=list.stream().filer(s->startsWith("张")); List <String> zhanglist=s1.collect(Collectors.toList()); System.out.println(zhangList);
-
-
将流转成Set集合
-
Stream <String> s2=list.stream().filer(s->startsWith("李")); Set<String> zhangSet =s2=collect(Collectors.toSet()); System.out.println(zhangSet);//注意流只能使用一次
-
-
将流转成Arrays数组
-
Object[] arrs=s3.toArray(); System.out.println(Arrays.toString(arrs));
-
String[] arrs=s3.toArray(new IntFunction<String[]>(){ @Override public String apply(int value){ return new String[value]; } });
-
String[] arrs=s3.toArray(String[]::new);
-