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

所属分类: 软件编程 / java 阅读数: 82
收藏 0 赞 0 分享

前言:

在没有接触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的方法

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

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流的方式遍历集合和数组操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

利用MultipartFile实现文件上传功能

这篇文章主要为大家详细介绍了利用MultipartFile实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java编程实现NBA赛事接口调用实例代码

这篇文章主要介绍了Java编程实现NBA赛事接口调用实例代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java编程之双重循环打印图形

这篇文章主要介绍了Java编程之双重循环打印图形,属于Java编程基础练习部分,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

java基础学习JVM中GC的算法

这篇文章主要介绍了java基础学习JVM中GC的算法,通过图文加深对GC算法思路的理解。
收藏 0 赞 0 分享

Java编程Post数据请求和接收代码详解

这篇文章主要介绍了Java编程Post数据请求和接收代码详解,涉及enctype的三种编码,post与get等相关内容,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Retrofit+Rxjava实现文件上传和下载功能

这篇文章主要介绍了Retrofit+Rxjava实现文件上传和下载功能,文中提到了单文件上传和多文件上传及相关参数的请求,需要的朋友参考下吧
收藏 0 赞 0 分享

Retrofit+Rxjava下载文件进度的实现

这篇文章主要介绍了Retrofit+Rxjava下载文件进度的实现,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java检查服务器的连通两种方法代码分享

这篇文章主要介绍了java检查服务器的连通两种方法代码分享,涉及ping的介绍以及检查服务器连通的两种方法代码示例,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java/Android 获取网络重定向文件的真实URL的示例代码

本篇文章主要介绍了Java/Android 获取网络重定向文件的真实URL的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java并发编程之同步器代码示例

这篇文章主要介绍了java并发编程之同步器代码示例,分享了相关代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享
查看更多