java8新特性stream流的⽅式遍历集合和数组操作
前⾔:
在没有接触java8的时候,我们遍历⼀个集合都是⽤循环的⽅式,从第⼀条数据遍历到最后⼀条数据,现在思考⼀个问题,为什么要使⽤循环,因为要进⾏遍历,但是遍历不是唯⼀的⽅式,遍历是指每⼀个元素逐⼀进⾏处理(⽬的),⽽并不是从第⼀个到最后⼀个顺次处理的循环,前者是⽬的,后者是⽅式。所以为了让遍历的⽅式更加优雅,出现了流(stream)!
1.流的⽬的在于强掉做什么
假设⼀个案例:将集合A根据条件1过滤为⼦集B,然后根据条件2过滤为⼦集C
在没有引⼊流之前我们的做法可能为:
public class Demo02NormalFilter {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张⽆忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
List<String> zhangList = new ArrayList<>();
for (String name : list) {
if (name.startsWith("张")) {
zhangList.add(name);
}
}
List<String> shortList = new ArrayList<>();
for (String name : zhangList) {
if (name.length() == 3) {
shortList.add(name);
}
}
for (String name : shortList) {
System.out.println(name);
}
}
}
filter过滤对象数组
现在以流的⽅式实现同样的功能:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张⽆忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.stream().filter(s->s.startsWith("张")).filter(s-> s.length() == 3).forEach(System.out::println);
从上⾯的两段代码可以看出流的存在让代码更加优雅。既然是筛选那么就直接⽤过滤⽅法就好了。
2.stream的⽅法
2.1 延迟⽅法:
这个和lambda表达式的延迟加载的原理⼀样,它可以进⾏链式编程,⽐如 ().filter().map().limit(),可以点下去,到最后⼀步(⽅法为count或者foreach)加载数据。这⾥主要介绍map和concat⽅法
1.filter,⽤来过滤
Stream<String> original = Stream.of("张⽆忌", "张三丰", "周芷若");
Stream<String> result = original.filter(s -> s.startsWith("张"));
result.forEach(name-> System.out.println(name));
2.map
将流中的元素映射到另⼀个流中,这个是在后期经常⽤到的,⽐如⽅法所接收的返回值是A,但是接收的却是B
这⾥举两个例⼦
例⼦1
将String类型的流转换为Integer 类型
Stream<String> stringStream = Stream.of("1", "2", "3", "4", "5", "6");
stringStream.map(str->Integer.parseInt(str)).forEach(System.out::println);
例⼦2
⽅法需要返回的是List <String>,但是这⾥只有List<Category>,此时就要想到stream().map
public List<String> queryNamesByIds(List<Long> ids){
List<Category> categories = this.categoryMapper.selectByIdList(ids);
return categories.stream().map(category -> Name()).List());
}
例⼦3
List<Object>转化为List<Cart>,其中List<Object>中的Object为Cart的json对象
//查询购物车数据(将List<Object>变成List<Cart>)
return carts.stream().map(o -> JsonUtils.String(),Cart.class)).List());
Stream<String> streamA = Stream.of("张⽆忌","张翠⼭");
Stream<String> streamB = Stream.of("美⽺⽺","喜⽺⽺");
//写法1
//at(streamA, streamB).forEach(System.out::println);
//写法2
Stream<String> result= at(streamA, streamB);
result.forEach(name-> System.out.println(name));
2.2 终结⽅法:
执⾏完的结果不能在调⽤延迟⽅法。如 ().filter().count().limit()这样的写法就会报错。
cout⽅法与foreach⽅法⽐较简单,这⾥不介绍了。
补充知识:JAVA Stream流的forEach遍历
Stream流的forEach:
如果希望在流当中进⾏元素的遍历操作,可以使⽤forEach⽅法:
forEach(Lambda)表达式,对每⼀个元素都要进⾏操作。
参数Lambda表达式必须是⼀个能够消费的⼀个参数,⽽且不产⽣数据结果的Lambda
例如:
Lambda: s -> System.out.println(s);
⽅法引⽤:System::println
println其为不会产⽣返回结果的Lambda
例如:对集合中每个元素的打印输出:
public class StreamForEach {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("abc");
list.add("def");
list.add("ghi");
Stream<String> streamA = list.stream();
// 对每⼀个元素进⾏打印输出
streamA.forEach((String s) -> {
System.out.println(s);
});
list.stream().forEach(s -> System.out.println(s));
list.stream().forEach(System.out::println);
}
}
以上这篇java8新特性 stream流的⽅式遍历集合和数组操作就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论