Java stream 流的基本使用

Java stream 的基本使用

java 复制代码
package com.zhong.streamdemo.usestreamdemo;

import jdk.jfr.DataAmount;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

/**
 * @ClassName : UseStream
 * @Description : stream 流的简单使用
 * @Author : zhx
 * @Date: 2024-02-08 15:24
 */
public class UseStream {
    public static void main(String[] args) {
        // filter 过滤不满足条件的元素 返回满足条件的元素
        System.out.println("-------------筛选成绩大于60分的信息-------------");
        ArrayList<Double> strem1 = new ArrayList<>(List.of(60.1, 45.2, 90.2, 99.9, 76.3));
        List<Double> collect = strem1.stream()
                .filter(x -> x > 60)
                .toList();
        System.out.println(collect);

        // stream 对于对象的操作
        System.out.println("-------------stream 对于对象的操作-------------");
        ArrayList<Student> students = new ArrayList<>(List.of(
                new Student("小钟", 22, 179.1),
                new Student("小钟", 22, 179.1),
                new Student("小王", 21, 153.9),
                new Student("小王", 21, 153.9),
                new Student("张三", 52, 160.8),
                new Student("李四", 42, 140.5),
                new Student("王五", 18, 135.3)
        ));
        // 筛选年龄大于 17 且小于 30 的学生信息
        System.out.println("-------------筛选年龄大于 17 且小于 30 的学生信息-------------");
        List<Student> list = students.stream()
                .filter(x -> x.getAge() > 17)       // 过滤年龄小于等于 17 的
                .filter(x -> x.getAge() < 30)       // 过滤年龄大于等于 30 的
                .toList();
        list.forEach(System.out::println);

        // 筛选身高最高的 3 名学生信息
        System.out.println("-------------筛选身高前三的学生信息-------------");
        List<Student> list1 = students.stream()
                .sorted(Comparator.comparing(Student::getHeight))   // 按照身高排序
                .skip(students.size() - 3)                      // skip(n) 忽略数组 -3 长度 相当于截取最后三个元素
                .toList();
        list1.forEach(System.out::println);

        // 筛选身高最后的 2 名学生信息
        System.out.println("-------------筛选身高前三的学生信息-------------");
        List<Student> list2 = students.stream()
                .sorted(Comparator.comparing(Student::getHeight))
                .limit(2)       // 截取几个元素
                .toList();
        list2.forEach(System.out::println);

        // 筛选身高超过 153 的学生的姓名 去除重复的名字
        System.out.println("-------------筛选身高超过 153 的学生的姓名 去除重复的名字-------------");
        List<String> list3 = students.stream()
                .filter(x -> x.getHeight() > 153)
                .map(Student::getName)  // 转换算子
                .distinct()             // distinct() 去重
                .toList();

        // distinct() 去重 如果是对象去重 需要重写 hashCode 和 equals 方法
        System.out.println(list3);

        // Stream.concat(stream1, stream2) 合并流
        System.out.println("-------------Stream.concat(stream1, stream2) 合并流-------------");
        Stream<String> stream1 = Stream.of("张三1", "李四1");
        Stream<String> stream2 = Stream.of("张三2", "李四2", "王五2");
        Stream<String> concatStream = Stream.concat(stream1, stream2);
        concatStream.forEach(System.out::println);
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Student {
    private String name;
    private int age;
    private double height;

    // distinct() 去重 如果是对象去重 需要重写 hashCode 和 equals 方法
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Student student = (Student) o;
//        return age == student.age && Double.compare(height, student.height) == 0 && Objects.equals(name, student.name);
//    }
//
//    @Override
//    public int hashCode() {
//        return Objects.hash(name, age, height);
//    }
}
相关推荐
tgethe17 分钟前
java并发——1
java·开发语言·面试
coder_zh_19 分钟前
Java基础-学习-面试-校招-要点突击检查
java
郑州光合科技余经理22 分钟前
海外O2O系统源码剖析:多语言、多货币架构设计与二次开发实践
java·开发语言·前端·小程序·系统架构·uni-app·php
威联通网络存储3 小时前
某高端显示面板制造企业:基于威联通 TS-h2490FU 的 AOI 检测数据治理实践
python·制造
工程师老罗7 小时前
Image(图像)的用法
java·前端·javascript
leo_messi947 小时前
2026版商城项目(一)
java·elasticsearch·k8s·springcloud
美味蛋炒饭.7 小时前
Tomcat 超详细入门教程(安装 + 目录 + 配置 + 部署 + 排错)
java·tomcat
FreakStudio7 小时前
不用装软件!这款MicroPython浏览器 IDE :让你在手机上也能调试树莓派 Pico
python·单片机·嵌入式·电子diy·tinyml
dreamxian7 小时前
苍穹外卖day11
java·spring boot·后端·spring·mybatis
Veggie267 小时前
【Java深度学习】PyTorch On Java 系列课程 第八章 17 :模型评估【AI Infra 3.0】[PyTorch Java 硕士研一课程]
java·人工智能·深度学习