上篇文章讲了java 8 的一个新特性:lambda表达式,在业务中若能熟练的使用,可以节省很多代码量,看着也整洁很多。那么这篇文章将介绍另一个新特性:stream流,不要看错哈!!!不是打游戏的steam!!
stream是java 8 提出的一个新概念,不是输入输出的 stream 流(和io流其实没有任何关系哈),而是一种使用函数式编程方式在集合类上进行操作的工具。简而言之,是以内部迭代的方式处理集合数据的抗美援朝作文操作,内部迭代可以将更多的控制权交给集合类。stream 和 iterator 的功能类似,只是lol卡皮肤iterator 是以外部迭代的形式处理集合数据的操一帮一活动作。
当然stream也有自己特性:
1.不是一种数据结构,不会存数据,只是在原数据集上定义了一组操作
2.这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作
3.因为不保存数据,故每个stream流只能使用一次。
stream流的实现图:
想要用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退出的新特性,那么肯定是有用处的。
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, 赵四, 巴基斯, 思密达]
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 条评论) |