栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java扩展之part23 Stream流

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java扩展之part23 Stream流

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 stream stream(T[] array);

获取当前数组、可变数据的stream流

public static stream of(T...value);

Collection集合获取流

Collection list =new ArrayList<>();
Stream s=list.stream();

Map集合获取流(需要获取键值对的值再调用流)

//键流
Map maps=new HashMap<>();
Stream keyStream=maps.keyset().stream();
//值流
Stream valuestream=maps.values().stream();
//键值对流
Stream> keyAndValueStream=maps.entrySet().Stream();

数组获取流(要注意)

String[] names={"","","",""};
Stream nameStream=Arrays.stream(names);
Stream 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(){
    @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 s1=list.stream.filter(s->s.StartsWith("张"));
Stream s2=Stream.of("java1","java2");
Stream 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 collector toList()//把元素收集到List集合中
public static  collector toSet()//把元素收集到Set集合中
public static collector to map(Function keyMapper,Function valueMappper)//把元素收集到Map集合中

将流转成ArrayList

Stream s1=list.stream().filer(s->startsWith("张"));
List  zhanglist=s1.collect(Collectors.toList());
System.out.println(zhangList);

将流转成Set集合

Stream  s2=list.stream().filer(s->startsWith("李"));
Set 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(){
    @Override
    public String apply(int value){
		return new String[value];
    }
});
String[] arrs=s3.toArray(String[]::new);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/764062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号