Java扩展之part23 Stream流

Stream流

目的:用于简化集合和数组操作的API

例子:将姓名中姓张的,并且为3个子的人的名字输出

names.stream().filter(s->s.startswith("张")).filter(s->s.length()==3).forEach(s->system.out.println(s));
  1. stream流的作用是什么,结合了什么技术?

    简化集合,数组操作的API,结合了Lambda表达式

  2. 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);
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值