首页 > 作文

Java的Stream流来了解一下

更新时间:2023-04-06 03:44:38 阅读: 评论:0

stream流

上篇文章讲了java 8 的一个新特性:lambda表达式,在业务中若能熟练的使用,可以节省很多代码量,看着也整洁很多。那么这篇文章将介绍另一个新特性:stream流,不要看错哈!!!不是打游戏的steam!!

1、什么是stream流:

stream是java 8 提出的一个新概念,不是输入输出的 stream 流(和io流其实没有任何关系哈),而是一种使用函数式编程方式在集合类上进行操作的工具。简而言之,是以内部迭代的方式处理集合数据的抗美援朝作文操作,内部迭代可以将更多的控制权交给集合类。stream 和 iterator 的功能类似,只是lol卡皮肤iterator 是以外部迭代的形式处理集合数据的操一帮一活动作。

当然stream也有自己特性:

1.不是一种数据结构,不会存数据,只是在原数据集上定义了一组操作

2.这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作

3.因为不保存数据,故每个stream流只能使用一次。

stream流的实现图:

2、创建流:

想要用stream流来操作集合,那么就需要将数组或者集合先转换成stream流才可以操作

stream的官方文档:

https://docs.oracle.com/en/java/java/17/docs/api/java.ba/java/util/stream/stream.html

先来看四个方法:

1.filter:通过lambda表达式来实现条件过滤

2.limit:截取流,截取一段流

3.skip:跳过流

4.distinct:去除重复

创建stream:

public class test {    public static void main(string[] args) {        string [] arr = {"东","南","西","北"};        //将数组转换成stream        stream<string> stream = arrays.stream(arr);        stream = stream.of(arr);        stream = stream.of("东","南","西","北");        //将list集合转换成stream        list<string> list = arrays.aslist("aa","cc","bb","aa","dd");        stream = list.stream();        //排序、去重、遍历        list.stream().sorted().distinct().foreach(system.out::println);        //用过stream流操作完集合后还可以再转换成一个新的集合        list<string> newlist = list.stream().sorted().distinct().collect(collectors.tolist());        system.out.println(newlist.tostring());    }}

输出:

//遍历并去重后的结果:
aa
bb
cc
dd
//用过stream流操作完集合后还可以再转换成一个新的集合
[aa, bb, cc, dd]

四个方法的操作:person类:

这个类代码比较多,所有不把get/t方法写进去了,大家的使用的时候别忘!!

public class person {    private string  name;    private integer age;    private  string country;    private  char x;    @override    public string tostring() {        return "信息表:{" +                "name='" + name + '\'' +                ", age=" + age +                ", country='" + country + '\'' +                ", x=" + x +                '}';    }//这里节省的get/t代码//重写tostring() 和 equals 和 hashcode 方法    @override    public boolean equals(object o){        if(this == o)            return true;        if(o == null || getclass() != o.getclass())            return fal;        person person = (person) o;        if(country != null){            if(this.country.equals(person.country)){                return  true;            }el{                return fal;            }        }        return fal;    }    @override    public int hashcode(){        return objects.hash(country);    }}

测试类:

结合了lambda表达式来写

public class test {    public static void main(string[] args) {        list<person> perosnlist = new arraylist<>();        perosnlist.add(new person("王一", 30, "中国", 'm'));        perosnlist.add(new person("张三", 19, "美国", 'f'));        perosnlist.add(new person("李四", 29, "日本", 'f'));        perosnlist.add(new person("小美", 74, "英国", 'm'));        perosnlist.add(new person("熊二", 15, "意大利", 'f'));        perosnlist.add(new person("熊大", 66, "韩国", 'f'));        //返回年龄大于20岁的学生集合        system.out.println("返回年龄大于20岁的学生集合");        perosnlist.stream().filter(p -> p.getage() > 20).foreach(system.out::println);        //返回年龄大于50岁的学生集合        system.out.println("返回年龄大于50岁的集合");        list<person> list = perosnlist.stream().filter(p -> p.getage() > 50).collect(collectors.tolist());        system.out.println(list);        //返回年龄大于20岁的中国学生        system.out.println("返回年龄大于20岁的中国人");        perosnlist.stream().filter(p -> p.getage() > 20).filter(p -> p.getcountry().equals("韩国")).foreach(system.out::println);        //年龄大于20  中国  性别m        system.out.println("返回年龄大于20  中国  性别m");        perosnlist.stream().filter(p -> p.getage() > 20 && p.getcountry().equals("中国") && p.getx() == 'm').foreach(system.out::println);    }}

看看结果:

返回年龄大于20岁的学生集合
信息表:{name=’王一’, age=30, country=’中国’, x=m}
信息表:{name=’李四’, age=29, country=’日本’, x=f}
信息表:{name=’小美’, age=74, country=’英国’, x=m}
信息表:{name=’熊大’, age=66, country=’韩国’, x=f}
返回年龄大于50岁的集合
[信息表:{name=’小美’, age=74, country=’英国’, x=m}, 信息表:{name=’熊大’, age=66, country=’韩国’, x=f}]
返回年龄大于20岁的中国人
信息表:{name=’熊大’, age=66, country=’韩国’, x=f}
返回年龄大于20 中国 性别m
信息表:{name=’王一’, age=30, country=’中国’, x=m}

小结:

使用stream流可以容易操作数组或者集合,可以结合lambda表达式,可以让一句表达式整洁明了,其实既然是java退出的新特性,那么肯定是有用处的。

3、stream的m无机盐的作用ap映射流

public class test {    public static void main(string[] args) {        //map的作用是迭代取到每个list元素,再通过map里面的函数进行相应的操作        list<string> list1 = arrays.aslist("a","bb","ccc","dddd");        //通过map取到每个集合元素的长度并返回        stream<integer> stream = list1.stream().map(p->p.length());        stream.foreach(system.out::println);        system.out.println("----------------");        list<string> urlist = new arraylist<>();        urlist.add("周杰伦.tom");        urlist.add("尼古拉斯.赵四");        urlist.add("牛顿.巴基斯");        urlist.add("赵少华.思密达");        list<string> ulist = urlist.stream().map(p->p.substring(p.indexof(".")+1,                p.length())).collect(collectors.tolist());        system.out.println(ulist.tostring());    }}

输出:

1
2
3
4
—————-
[tom, 赵四, 巴基斯, 思密达]

4、stream查找与匹配

stream内还有一个anymatch(predicate predicate)的方法:

返回此流中的任何元素是否匹配所提供的词

demo:

public class test {    public static void main(string[] args) {       中国精神 list<string> list = arrays.aslist("周杰伦","王力宏","孙燕姿","林俊杰");        boolean flag1 = list.stream().anymatch(ele->ele.contains("燕"));        system.out.println("有没有名字包含燕的同学:"+flag1);        //判断开头:        boolean flag2 = list.stream().anymatch(ele->ele.startswith("王"));        system.out.println("有没有名字开头是王的同学:"+flag2);        //判断结尾:        boolean flag3 = list.stream().anymatch(ele->ele.endswith("杰"));        system.out.println("有没有名字结尾是杰的同学:"+flag3);        // anymatch是匹配所有的,要满足条件        boolean flag4 = list.stream().anymatch(ele->ele.length()>2);        system.out.println("所有同学的名字都是两个字以上的吗"+flag4);        boolean flag5 = list.stream().anymatch(ele->ele.startswith("王"));        system.out.println("所有同学的名字都有王吗?"+flag5);        //nonematch        boolean flag6 = list.stream().nonematch(ele->ele.contains("燕"));        system.out.println("集合中都没有包含'燕'这个字吗"+flag5);    }}

输出:

有没有名字包含燕的同学:true
有没有名字开头是王的同学:true
有没有名字结尾是杰的同学:true
所有同学的名字都是两个字以上的吗true
所有同学的名字都有王吗?true
集合中都没有包含’燕’这个字吗true

使用anymatch()里面的方法可以很容易对这个流的信息匹配。

最后附上一张stream流的方法速记图啦:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!

本文发布于:2023-04-06 03:44:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/9f1c423726b34da42d00edf72dd71734.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Java的Stream流来了解一下.doc

本文 PDF 下载地址:Java的Stream流来了解一下.pdf

标签:年龄   操作   中国   名字
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图