java8新特性 stream流的方式遍历集合和数组操作

作者:光哥_帅 时间:2023-03-29 10:49:25 

前言:

在没有接触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);
     }
   }
 }

现在以流的方式实现同样的功能:


  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的方法

java8新特性 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));

java8新特性 stream流的方式遍历集合和数组操作

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 -> category.getName()).collect(Collectors.toList());
 }

例子3


List<Object>转化为List<Cart>,其中List<Object>中的Object为Cart的json对象

//查询购物车数据(将List<Object>变成List<Cart>)
   return carts.stream().map(o -> JsonUtils.parse(o.toString(),Cart.class)).collect(Collectors.toList());

3.contract,两个流合并成一个流


  Stream<String> streamA = Stream.of("张无忌","张翠山");
   Stream<String> streamB = Stream.of("美羊羊","喜羊羊");
   //写法1
   //Stream.concat(streamA, streamB).forEach(System.out::println);

//写法2
   Stream<String> result= Stream.concat(streamA, streamB);
   result.forEach(name-> System.out.println(name));

java8新特性 stream流的方式遍历集合和数组操作

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);
}
}

来源:https://blog.csdn.net/jerry11112/article/details/101376162

标签:java8,stream,遍历,集合,数组
0
投稿

猜你喜欢

  • Android SearchView搜索框组件的使用方法

    2023-06-25 08:13:42
  • Android Activity与Intent详解及示例代码

    2023-07-13 17:10:33
  • Android使用SQLite数据库的示例

    2023-09-17 07:36:58
  • C#创建临时文件的方法

    2023-06-16 14:32:36
  • SpringBoot选择自有bean优先加载实现方法

    2023-05-21 06:22:39
  • datatable去掉重复行的方法

    2023-09-02 19:59:41
  • MyBatis JdbcType 与Oracle、MySql数据类型对应关系说明

    2023-08-23 02:23:06
  • springboot手写一个自己的starter源码

    2021-07-31 10:18:14
  • Android Studio 透明状态栏的实现示例

    2022-12-06 21:44:23
  • DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息(最新推荐)

    2023-10-19 22:53:54
  • Spring基于AspectJ的AOP开发案例解析

    2021-12-01 01:59:22
  • Kotlin浅析延迟初始化与密封类的实现方法

    2023-05-06 13:54:44
  • Android实现的秒表计时器示例

    2023-04-26 11:32:56
  • SpringMVC记录我遇到的坑_AOP注解无效,切面不执行的解决

    2021-08-09 06:20:58
  • MybatisPlus中@TableField注解的使用详解

    2021-11-01 23:05:35
  • Maven 错误找不到符号的解决方法

    2021-07-19 09:03:02
  • java开发RocketMQ消息中间件原理基础详解

    2023-10-01 21:04:49
  • Android TabHost组件使用方法详解

    2023-11-14 20:01:13
  • RxJava+Retrofit实现网络请求封装的方法

    2023-08-13 19:39:13
  • 深入理解以DEBUG方式线程的底层运行原理

    2022-07-12 03:19:40
  • asp之家 软件编程 m.aspxhome.com