Java学习_18_Stream流


前言

博客仅记录个人学习进度和一些查缺补漏。
学习内容:BV17F411T7Ao


一、不可变集合

不可变集合就是长度和内容都不可变的集合

在这里插入图片描述
即直接使用静态方法来创建
在这里插入图片描述
例如:
在这里插入图片描述
在这里插入图片描述
set没有索引,只能通过迭代器或增强for来遍历
并且set集合元素是唯一的,可以用来去重,同时在获取静态set时,要注意其中不可以有重复元素

list和set的of方法底层是可变参数

在这里插入图片描述
细节1:键是不能重复的。
细节2:静态map中最多只能传入10个元素。
map的传入参数都是写死的,做多只有10个,因为想要传入多个不确定数量的键和值,就需要传入键和值两个可变参数,但是可变参数只能只有一个
在这里插入图片描述
细节3:如果需要传递多个可变的键值对,可以直接传入entry对象
(默认使用hashmap)
但是需要注意entry实际上是map的内部类,我们需要先创建一个普通的map集合,然后将其中的entry使用toArry方法转换成一个数组。
在这里插入图片描述
在这里插入图片描述
简化版:
在这里插入图片描述
极简版:
在这里插入图片描述
注意,copyof方法在JDK10以上才能使用。

二、Stream流

思想

stream流就是将数据变成一个流水线上的对象(创造一个流水线),然后依次对其进行操作处理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一步:得到Stream流

在这里插入图片描述

        //获取单列集合的steam流
        ArrayList<String> arrayList = new ArrayList<>();
        Collections.addAll(arrayList, "a", "b", "c", "d","e");

        //获取一条流水线,并把集合放上去
        Stream<String> stream = arrayList.stream();
        //直接打印看看,结果是地址值
        System.out.println(stream);//java.util.stream.ReferencePipeline$Head@776ec8df
        //使用循环打印
        stream.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        //简化版本
        arrayList.stream().forEach(s -> System.out.println(s));
        
        //获取双列集合的steam流
        HashMap<String, String> hashMap = new HashMap<>();
        //添加数据
        hashMap.put("a", "1");
        hashMap.put("b", "2");
        hashMap.put("c", "3");
        hashMap.put("d", "4");
        hashMap.put("e", "5");
        //获取stream流,注意,map是双列集合,不能直接获取stream流,需要分开成键流和值流
        hashMap.keySet().stream().forEach(s-> System.out.println(s));

        //获取数组的steam流
        int[] nums = {1,2,3,4,5,6,7,8,9,0};

        //使用Arrays工具类转换成stream流
        Arrays.stream(nums).forEach(s-> System.out.println(s));

        //获取零散数据的steam流
        Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));

细节:of方法内如果传入的是一个数组变量,最后打印出来的会是该变量的地址值,此时认为传入steam的是该数组变量的地址。

第二步:Stream流的中间方法

在这里插入图片描述
例如:过滤方法
在这里插入图片描述
简写为:
在这里插入图片描述
注意,中间过程(如过滤)不会对原数据产生任何影响。
limit和skip方法:
在这里插入图片描述
去重方法:底层依赖hashcode和equals方法,所以对于自定义类型时需要重写这两个方法。
在这里插入图片描述
在这里插入图片描述

数据类型转换方法:map
在这里插入图片描述
在这里插入图片描述

Stream流的终结方法

v
终结方法的返回值一般是void
在这里插入图片描述
在这里插入图片描述
将数据收集进数组中:
在这里插入图片描述
注意,这是一个函数式方法,其中参数需要是一个具体类型的数组,改写后如下:
在这里插入图片描述
lambda表达式形式:其中value为数组化后数组大小
在这里插入图片描述

将数据收集进集合中:

在这里插入图片描述

在这里插入图片描述
set和list最大的区别是set不可重复(如果出现了重复会自动去重)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:在收集到map中时,不可以使用重复的键,即不存在覆盖功能。
lambda表达式形式:
在这里插入图片描述

总结

流的出现让数据处理从几十行代码缩减到一两行就能实现,简化了很多集合数组的操作。
在这里插入图片描述

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 8的stream)操作是一种新的API,提供了一种简单而有效的方法来处理集合和数组等数据类型。操作可以让我们以一种更加声明式的方式来处理数据,从而提高代码的可读性和可维护性。 Java 8中的操作具有以下特点: 1. 集成了过滤、映射、排序、聚合等操作; 2. 支持并行处理,提高了运行效率; 3. 可以避免空指针异常等常见问题; 4. 支持延迟计算,节省了资源。 下面是使用Java 8的操作的一些示例: 1. 过滤操作: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); ``` 上面的代码使用了stream()方法将List转换成,使用filter()方法过滤出偶数,最后使用collect()方法将结果转换成List。 2. 映射操作: ``` List<String> words = Arrays.asList("hello", "world"); List<Integer> result = words.stream() .map(String::length) .collect(Collectors.toList()); ``` 上面的代码使用了map()方法将List中的字符串转换成它们的长度,最后使用collect()方法将结果转换成List。 3. 排序操作: ``` List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2); List<Integer> result = numbers.stream() .sorted() .collect(Collectors.toList()); ``` 上面的代码使用了sorted()方法将List中的数字按升序排序,最后使用collect()方法将结果转换成List。 4. 聚合操作: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Optional<Integer> result = numbers.stream() .reduce((a, b) -> a + b); ``` 上面的代码使用了reduce()方法将List中的数字相加,最后返回一个Optional对象,其值为15。 在实际开发中,Java 8的操作可以大大简化代码,提高开发效率。但是需要注意的是,在处理大量数据时,操作可能会对性能产生影响,因此需要根据实际情况选择合适的方法。 ### 回答2: Java 8引入了stream)操作,它是一种用于处理集合数据的新方式。 操作主要通过对集合进行一系列的处理操作来实现数据的筛选、转换、聚合等功能。与传统的集合操作相比,操作具有更加简洁、灵活和高效的特点。下面是一些常用的操作: 1. 过滤(filter):根据指定条件从中筛选出符合条件的元素。 2. 映射(map):通过对中的每个元素应用指定的函数来生成一个新的,可以对元素进行转换或提取。 3. 排序(sorted):对中的元素进行排序,可以根据自然顺序或自定义的排序规则进行排序。 4. 限制(limit):截断,获取指定数量的元素。 5. 跳过(skip):跳过指定数量的元素。 6. 匹配(matching):用于检查中的元素是否满足指定的条件。 7. 查找(finding):在中查找符合指定条件的元素。 8. 聚合(reducing):将中的元素使用指定的操作进行聚合,可以得到最大值、最小值、求和等结果。 9. 收集(collecting):将中的元素收集到一个集合中,可以使用预定义的收集器或自定义的收集器。 使用操作可以大大简化代码,并且使得操作更为直观和易于理解。它提供了丰富的功能,可以处理各种不同类型的集合数据。同时,操作的使用还可以减少中间变量的使用,提高代码的性能。 综上所述,Java 8的操作是一种强大的工具,可以帮助我们对集合数据进行高效的处理,提升代码的简洁性和可读性。它是现代化Java编程中不可或缺的一部分。 ### 回答3: Java 8 引入了stream)操作,它是一种新的处理数据集合的方式。操作可以让我们以更简洁、清晰和灵活的方式处理数据。 首先,是一组有序的元素,它可以来自各种数据源,比如数组、集合或者I/O通道。操作分为两种类型:中间操作和终端操作。中间操作可以对进行转换或者过滤,但并不产生最终结果。而终端操作会触发的处理,并产生一个结果或副作用。 通过操作,我们可以进行各种常见的数据处理操作。例如,我们可以使用 filter 方法来过滤中的元素,只保留符合条件的元素。可以使用 map 方法来对中的元素进行映射,生成一个新的。可以使用 reduce 方法将中的所有元素聚合起来并生成一个结果。 此外,操作还支持并行处理。通过将转换为并行,我们可以同时对多个元素进行处理,提高处理效率。但是需要注意的是,并不是所有的操作都适合并行处理,有些操作在并行处理时可能会导致结果不确定或出错。 总之,Java 8 的操作可以让我们以更简洁、灵活的方式处理数据集合。它提供了丰富的中间操作和终端操作,支持串行和并行处理。通过学习和掌握操作,我们可以更高效地处理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值