【Java】Stream 流 —— 解决 Java 集合运算

一、什么是 Stream 流

StreamJava 8 API 添加的一个新的抽象 , Stream 使用一种 类似用 SQL 语句从数据库查询数据 的直观方式提供一种对 Java 集合运算 的高阶抽象。

Stream API可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码

Stream 将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

二、Stream 流的使用

1. 生成流

(1)串行流 —— stream
(2)并行流 —— parallelStream
(3)示例

    public static void main(String[] args) {
        // 创建一个字符集合
        List<String> list = Arrays.asList(new String[]{"wanqing", "learns", "Java", ""});
        // 生成流
        // 方法 1  —— 创建串行流
        // 下面的代码实现 过滤出 list 中的空字符串,并且将结果转换为 list
        List<String> filtered = list.stream()
                                    .filter(string -> !string.isEmpty())
                                    .collect(Collectors.toList());
        System.out.println(filtered.size());
        // 方法 2 —— 创建并行流
        List<String> filtered2 = list.parallelStream()
                .filter(string -> !string.isEmpty())
                .collect(Collectors.toList());
    }

2. 流常用方法

(1) map

映射每个元素到对应的结果

示例1:

   		 // 创建一个字符集合
        List<String> list = Arrays.asList(new String[]{"wanqing", "learns", "Java", ""});
        // 下面的代码实现将 list 集合中所有字符串 string 映射(改变)为 string + string
        List<String> reduce = list.stream().map(string -> string + string).collect(Collectors.toList());
        // 测试输出 [wanqingwanqing, learnslearns, JavaJava, ]
        System.out.println(reduce);

示例2:

求取存放学生类的集合的所有学生年龄和

public class UseOfStream {

    public static void main(String[] args) {
        List<Student> list1 = new ArrayList<>();
        Student s1 = new Student(1, "a");
        Student s2 = new Student(2, "a");
        list1.add(s1);
        list1.add(s2);
        // 通过 mapToInt 将学生对象映射为 学生年龄age ,然后再使用 sum 求和 —— 注意:集合为空时这么使用会爆异常,要进行处理
        int sum2 = list1.stream().mapToInt(student->student.getAge()).sum();
        int max2 = list1.stream().mapToInt(student->student.getAge()).max().getAsInt();
        System.out.println("年龄和为:" + sum2);
        System.out.println("最大年龄:" + max2);
    }

    private static class Student{
        int age;
        String name;

        public Student(int age, String name) {
            this.age = age;
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

}

(2) filter

通过设置的条件过滤出元素

    	// 创建一个字符集合
        List<String> list = Arrays.asList(new String[]{"wanqing", "learns", "Java", ""});
        // 下面的代码实现 过滤出 list 中的空字符串,并且将结果转换为 list
        List<String> filtered = list.stream()
                                    .filter(string -> !string.isEmpty())
                                    .collect(Collectors.toList());

(3) sorted

用于对流进行排序,可以通过传入比较器自定义排序规则,也可以使用默认排序规则

关于比较器的内容请看:Java 比较器介绍

       List<String> sort = list.stream().sorted(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 自定义排序规则,这里用作示例
                return 0;
            }
        }).collect(Collectors.toList());

(4) 统计

使用产生统计结果的收集器对集合数据进行统计

        // 四、统计数据的使用
        List<Integer> listNums = Arrays.asList(new Integer[]{3, 7, 9, 2, 8});
        // 对 int 类型数据进行统计 - 得到整型统计类型类
        IntSummaryStatistics statistics = listNums.stream().mapToInt(num ->num).summaryStatistics();
        // 得到统计的各个结果
        int max = statistics.getMax();
        int min = statistics.getMin();
        long sum = statistics.getSum();
        double average = statistics.getAverage();

(5) reduce

reduceStream 的一个聚合方法,它把一个 Stream 的所有元素按照聚合函数聚合成一个结果

示例1:

单参数的 reduce 使用

		reduce(T 操作的基本数据类型,即泛型:: 操作名称)
        // reduce 的使用
        int max = listNums.stream().reduce(Integer:: max).orElse(-1);
        int sum = listNums.stream().reduce(Integer::sum).orElse(0);

示例2:

使用 reduce 对 map 映射后的数据进行处理

public class UseOfStream {

    public static void main(String[] args) {
        List<Student> list1 = new ArrayList<>();
        Student s1 = new Student(1, "a");
        Student s2 = new Student(2, "a");
        list1.add(s1);
        list1.add(s2);
        int sum3 = list1.stream().mapToInt(student->student.getAge()).reduce(Integer::sum).orElse(0);
        System.out.println("年龄和为:" + sum3);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遍历Java集合可以使用Java 8引入的Stream的方式。Stream提供了一种对集合进行操作的高阶抽象。通过使用Stream,可以使用类似于SQL语句的方式对集合进行查询和操作。下面是一个使用Stream遍历集合的示例代码: ```java import java.util.ArrayList; import java.util.stream.Stream; public class StreamDemo { public static void main(String[] args) { ArrayList<String> webSites = new ArrayList<>(); webSites.add("baidu"); webSites.add("google"); webSites.add("weibo"); // 使用Stream遍历集合 webSites.stream().forEach(e -> { System.out.println(e); }); } } ``` 在这个示例中,我们创建了一个ArrayList集合`webSites`,并向其中添加了三个元素。然后,我们使用`stream()`方法将集合转换为,之后使用`forEach()`方法对中的每个元素进行遍历,并将元素打印出来。这样就可以使用Stream流对集合进行遍历了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Stream遍历集合,对集合中数据进行过滤](https://blog.csdn.net/qq_40649503/article/details/108762599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java8 用Stream代替传统的集合遍历](https://blog.csdn.net/joshua317/article/details/128244212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值