首页 > 其他分享 >使用传统的方式,遍历集合,对集合中的数据进行过滤与使用Stream流的方式,遍历集合,对集合中的数据进行过滤

使用传统的方式,遍历集合,对集合中的数据进行过滤与使用Stream流的方式,遍历集合,对集合中的数据进行过滤

时间:2022-10-11 15:12:19浏览次数:57  
标签:遍历 Stream list add 过滤 集合

使用传统的方式,遍历集合,对集合中的数据进行过滤

Stream流

说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"0流"呢﹖在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端。

传统集合的多少遍历代码

  几乎所有的集合(如collection接口或Map 接口等)都支持直接或间接的遍历操作。而当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。例如∶

  传统方式

package day01.Demo01_Day016;

import java.util.ArrayList;
import java.util.List;

public class Demo01ForEach {
    public static void main(String[] args) {
        List<String> list  = new ArrayList<>();
        list.add("王耀");
        list.add("程冰");
        list.add("若枫");
        list.add("吴小顺");
        list.add("李聪");
        for (String s : list) {
            System.out.println(s);
        }
    }
}

这是一段非常简单的集合遍历操作:对集合中的每一个字符串都进行输出打印操作

遍历循环的弊端

Java8的Lambda让我们更加专注于做什么(What),而不是怎么做(How),这点此前已经结合内部类进行

了对比说明。现在我们仔细体会一下上例代码

for循环的语法就是“怎么做”
for循环的循环体才是“做什么”
为什么使用循环?因为要进行遍历。但循环是遍历的唯一方式吗?遍历是指每一个元素逐一进行处理,而并不是从
第一个到最后一个顺次处理的循环。前者是目的,后者是方式。
试想一下,如果希望对集合中的元素进行筛选过滤:

1. 将集合A根据条件一过滤为子集B;
2. 然后再根据条件二过滤为子集C。

在java8之前的做法可能为:

package day01.Demo01_Day016;
 
import java.util.ArrayList;
import java.util.List;
 
/*
    使用传统的方式,遍历集合,对集合中的数据进行过滤
 */
public class Demo01List {
    public static void main(String[] args) {
        //创建一个List集合,存储姓名
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
 
        //对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合中
        List<String> listA = new ArrayList<>();
        for(String s : list){
            if(s.startsWith("张")){
                listA.add(s);
            }
        }
 
        //对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中
        List<String> listB = new ArrayList<>();
        for (String s : listA) {
            if(s.length()==3){
                listB.add(s);
            }
        }
 
        //遍历listB集合
        for (String s : listB) {
            System.out.println(s);
        }
    }
}

这段代码中含有三个循环,每一个作用不同:
1. 首先筛选所有姓张的人;
2. 然后筛选名字有三个字的人;
3. 最后进行对结果进行打印输出。
每当我们需要对集合中的元素进行操作的时候,总是需要进行循环、循环、再循环。这是理所当然的么?不是。循
环是做事情的方式,而不是目的。另一方面,使用线性循环就意味着只能遍历一次。如果希望再次遍历,只能再使
用另一个循环从头开始

Stream的更优写法

下面来看一下借助Java8的StreamAPI,什么叫优雅

使用Stream流的方式,遍历集合,对集合中的数据进行过滤
Stream流是JDK1.8之后出现的
关注的是做什么,而不是怎么做

 1 package day01.Demo01_Day016;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class Demo02Stream {
 7     public static void main(String[] args) {
 8         List<String> list  = new ArrayList<>();
 9         list.add("刘亦菲");
10         list.add("周芷若");
11         list.add("周薇");
12         list.add("胡歌");
13         list.add("夜轻染");
14         list.add("周作人");
15         //对list集合中的元素进行过滤,只要以周开头的元素,存储到一个新的集合中
16         //对list1集合进行过滤,只要姓名长度为3的,存储到一个新的集合中
17         //遍历集合输出
18         list.stream()
19                 .filter(name->name.startsWith("周")).filter(name->name.length()==3).forEach(name-> System.out.println(name));
20 
21     }
22 }

 

标签:遍历,Stream,list,add,过滤,集合
From: https://www.cnblogs.com/x3449/p/16779255.html

相关文章

  • wordpress wp_insert_post插入文章iframe被自动过滤iframe无法插入iframe消失
    add_filter('wp_kses_allowed_html','esw_author_cap_filter',1,1);functionesw_author_cap_filter($allowedposttags){ if(!current_user_can('publish_posts'......
  • 常用的函数式接口_Predicate接口练习_集合信息筛选与常用的函数式接口_Function接口
    练习:集合信息筛选题目:数组当中有多条“姓名+性别”的信息如下,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,需要同时满足两个条件:......
  • JavaScript高级程序设计笔记06 集合引用类型
    集合引用类型1.Object(详见c08p205)适合存储,在应用程序间交换数据创建实例:a.显式构造函数b.字面量——>不会调用构造函数(代码更少、更有封装感)函数:大量参数的情况......
  • 协同过滤
    基于余弦相似度的协同过滤推荐算法  ......
  • list集合的add和set方法区别
    JavaList.add添加元素java中list添加元素有2种方式,一种是add(Elemente),添加元素时,是依次往后添加;另一种是add(Indexi,Elemente),添加元素时,若索引位置没有值,则直接添加,若......
  • Java集合
    集合集合的概念对象的的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能和数组的区别:数组长度固定,集合长度不固定数组可以存储基本数据类型和引用......
  • drf分页、排序、过滤
    drf分页、排序、过滤自定义频率类#首先我们导入时间模块用来计时importtime#创建一个类继承BaseThrottleclassFrequency(BaseThrottle):#创建一个字典用来......
  • 自定义频率类与分页、排序、过滤功能
    自定义频率类fromrest_framework.throttlingimportBaseThrottleimporttimeclassMyThrottling(BaseThrottle):#存放用户访问记录:{IP1:[时间2,时间1]}......
  • drf之频率类,分页,排序,过滤
    一、自定义频率类#我们之前写的频率类其实是可以继承两个的SimpleRateThrottle,BaseThrottle#只不过现继承BaseThrottle需要重写BaseThrottle方法我们现在按照继......
  • 自定义频率类,分页,排序,过滤
    自定义频率类fromrest_framework.throttlingimportBaseThrottleclassMyThrottle(BaseThrottle):VISIT_RECORD={}#存放用户访问记录{ip1:[时间1,时间2],ip2:......