StremUtil使用

一、代码示例

//将查询出的运费模板中的关联城市收集起来
List<String> associatedCityList = StreamUtil.of(list)
                //排除掉自己,检查与其他模板是否存在冲突
                .filter(carriageEntity -> ObjectUtil.notEqual(carriageEntity.getId(), carriageDto.getId()))
                //获取关联城市
                .map(CarriageEntity::getAssociatedCity)
                //将关联城市按照逗号分割
                .map(associatedCity -> StrUtil.split(associatedCity, ','))
                //将上面得到的集合展开,得到字符串
                .flatMap(StreamUtil::of)
                //收集到集合中
                .collect(Collectors.toList());        

二、 详细解释

1. **`StreamUtil.of(list)`**:
   - `StreamUtil` 是一个实用类,`of` 方法用于将一个 `List` 转换为一个流 (`Stream`)。
   - `list` 是一个包含 `CarriageEntity` 实体对象的列表。使用流后,可以对这个列表进行一系列的操作,如过滤、映射、转换等。

2. **`.filter(carriageEntity -> ObjectUtil.notEqual(carriageEntity.getId(), carriageDto.getId()))`**:
   - `filter` 方法用于过滤流中的元素,只有满足条件的元素会保留在流中。
   - 在这里,`ObjectUtil.notEqual` 用于检查当前的 `CarriageEntity` 对象的 `id` 是否与 `carriageDto` 的 `id` 不相等。换句话说,`filter` 方法会排除与传入的 `carriageDto` 对象相同的模板,从而只检查其他模板是否有冲突。

3. **`.map(CarriageEntity::getAssociatedCity)`**:
   - `map` 方法用于将流中的每个元素映射为另一个形式。在这里,每个 `CarriageEntity` 对象被映射为它的 `associatedCity` 字段值。
   - `CarriageEntity::getAssociatedCity` 是一个方法引用,表示对 `CarriageEntity` 对象的 `getAssociatedCity` 方法的引用。

4. **`.map(associatedCity -> StrUtil.split(associatedCity, ','))`**:
   - 这个 `map` 操作进一步处理每个 `associatedCity` 字符串,将其按照逗号 `,` 分割为一个 `List<String>`。
   - `StrUtil.split` 是一个实用方法,用于将字符串按照指定的分隔符分割成列表。

5. **`.flatMap(StreamUtil::of)`**:
   - `flatMap` 方法用于将每个元素映射为一个流,然后将多个流合并为一个流。换句话说,它“展开”了之前的列表集合。
   - 在这里,每个 `associatedCity` 字符串列表都被展开为单独的城市字符串,然后所有这些字符串被合并为一个大的流。
   - `StreamUtil::of` 将字符串列表转换为流。

6. **`.collect(Collectors.toList())`**:
   - `collect` 方法用于将流的结果收集起来,并最终转换为一个集合。在这里,`Collectors.toList()` 将流中的所有城市字符串收集到一个 `List<String>` 中。

三、 流 (Stream) 的使用方法

Java 8 引入的流 (`Stream`) API 是一种处理数据集合的声明性方式,它提供了许多强大的功能,使得代码更加简洁、可读和高效。以下是流的一些关键特性和方法:

1. **创建流**:
   - 可以从集合(如 `List`、`Set`)、数组、文件、生成器等创建流。
   - 例如,`Stream.of(...)` 或 `list.stream()` 可以创建流。

2. **中间操作**:
   - 中间操作会返回一个新的流,这些操作是惰性求值的,意味着它们不会立即执行,直到遇到终端操作。
   - 常用的中间操作包括 `filter`(过滤)、`map`(映射)、`flatMap`(展平映射)、`sorted`(排序)、`distinct`(去重)等。

3. **终端操作**:
   - 终端操作会触发流的处理,并返回一个结果,如 `collect`(收集)、`forEach`(遍历)、`reduce`(归约)、`count`(计数)等。
   - 一旦执行终端操作,流就会被“消耗”并且不能再使用。

4. **短路操作**:
   - 有些终端操作会在满足条件后立即停止流的处理,如 `anyMatch`、`allMatch`、`noneMatch`、`findFirst`、`findAny`。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyt涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值