【stream的使用】使用stream.filter过滤List对象

Stream初相识

概括讲,可以将Stream流操作分为3种类型:

创建Stream

Stream中间处理

终止Steam

每个Stream管道操作类型都包含若干API方法,先列举下各个API方法的功能介绍。

开始管道

主要负责新建一个Stream流,或者基于现有的数组、List、Set、Map等集合类型对象创建出新的Stream流。

API 功能说明 stream() 创建出一个新的stream串行流对象

parallelStream() 创建出一个可并行执行的stream流对象

Stream.of() 通过给定的一系列元素创建一个新的Stream串行流对象

中间管道

负责对Stream进行处理操作,并返回一个新的Stream对象,中间管道操作可以进行叠加。

API 功能说明 filter() 按照条件过滤符合要求的元素, 返回新的stream流

map() 将已有元素转换为另一个对象类型,一对一逻辑,返回新的stream流

flatMap() 将已有元素转换为另一个对象类型,一对多逻辑,即原来一个元素对象可能会转换为1个或者多个新类型的元素,返回新的stream流

limit() 仅保留集合前面指定个数的元素,返回新的stream流 skip() 跳过集合前面指定个数的元素,返回新的stream流

concat() 将两个流的数据合并起来为1个新的流,返回新的stream流

distinct() 对Stream中所有元素进行去重,返回新的stream流

sorted() 对stream中所有的元素按照指定规则进行排序,返回新的stream流

peek() 对stream流中的每个元素进行逐个遍历处理,返回处理后的stream流

终止管道

顾名思义,通过终止管道操作之后,Stream流将会结束,最后可能会执行某些逻辑处理,或者是按照要求返回某些执行后的结果数据

API 功能说明 count()返回stream处理后最终的元素个数 max()返回stream处理后的元素最大值

min()返回stream处理后的元素最小值 findFirst()找到第一个符合条件的元素时则终止流处理

findAny()找到任何一个符合条件的元素时则退出流处理,这个对于串行流时与findFirst相同,对于并行流时比较高效,任何分片中找到都会终止后续计算逻辑

anyMatch()返回一个boolean值,类似于isContains(),用于判断是否有符合条件的元素

allMatch()返回一个boolean值,用于判断是否所有元素都符合条件 noneMatch()返回一个boolean值,

用于判断是否所有元素都不符合条件 collect()将流转换为指定的类型,通过Collectors进行指定 toArray()将流转换为数组

iterator()将流转换为Iterator对象 foreach()无返回值,对元素进行逐个遍历,然后执行给定的处理逻辑

java 复制代码
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class StudentInfo  implements Comparable<StudentInfo> {
    
    //姓名
    private String name;

    //性别 true男 false女
    private Boolean sex;

    //年龄
    private Integer age;

    //身高,单位米
    private Double height;

    //出生日期
    private LocalDate birthday;

    @Override
    public int compareTo(StudentInfo student) {
        return this.age.compareTo(student.getAge());
    }


    @Override
    public String toString() {
        return String.format("%s\t\t%s\t\t%s\t\t%s\t\t%s",
                this.name, this.sex.toString(), this.age.toString(), this.height.toString(), birthday.toString());

    }
    /**
     * 打印学生信息的静态方法
     *
     * @param studentList 学生信息列表
     */
    public static void printStudentList(List<StudentInfo> studentList) {
        System.out.println("【姓名】\t\t【性别】\t\t【年龄】\t\t【身高】\t\t【生日】");
        System.out.println("-----------------------------------------------------");
        studentList.forEach(s -> System.out.println(s.toString()));
        System.out.println(" ");
    }

}
java 复制代码
class  testmain{
    public static void main(String[] args) {
        List<StudentInfo> studentList = new ArrayList<>();
        //使用builder添加数据
        studentList.add(StudentInfo.builder().name("李四明").sex(true).age(18).height(1.88).birthday( LocalDate.of(2007, 8, 30)).build());
        // 添加测试数据,请不要纠结数据的严谨性
        studentList.add(new StudentInfo("王五明", true, 23, 1.89, LocalDate.of(2000, 1, 16)));
        studentList.add(new StudentInfo("麻六的", false, 27, 1.75, LocalDate.of(1996, 9, 20)));
        studentList.add(new StudentInfo("刘七已", false, 30, 1.93, LocalDate.of(1993, 6, 19)));
        studentList.add(new StudentInfo("王八爬", false, 30, 1.75, LocalDate.of(1993, 6, 19)));

        // 输出没有过滤条件的学生列表
        StudentInfo.printStudentList(studentList);
        // 添加过滤条件,比如年龄小于25岁并且身高大于1米7的学生列表
        List<StudentInfo> ageHeightList = studentList.stream().filter(student -> student.getAge() < 25 && student.getHeight() > 1.7).collect(Collectors.toList());
        // 输出符合条件的学生列表
        StudentInfo.printStudentList(ageHeightList);



        //输出list
        StudentInfo.printStudentList(studentList);
        //从对象中提取age。并过滤年龄
        List<Integer>   nameList=studentList.stream().map(StudentInfo::getAge).filter(f->f>18).distinct().collect(Collectors.toList());
        nameList.forEach(System.out::println);


    }
}
相关推荐
陈大爷(有低保)31 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
kinlon.liu1 小时前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓1 小时前
Linux通过yum安装Docker
java·linux·docker
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Jarlen1 小时前
将本地离线Jar包上传到Maven远程私库上,供项目编译使用
java·maven·jar
蓑 羽2 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
Reese_Cool2 小时前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言