stream流
Stream流的skip方法
1 | //分页显示 |
skip(lang n)是一个跳过前n个元素的中间流操作,skip()方法用于跳过前面n个元素,然后再返回新的流
(1)当n<0时,抛IllegalArgumentException异常;
(2)当n=0时,相当没有跳过任何元素,原封不动、完璧归赵;
(3)当0<n<length时,跳过n个元素后,返回含有剩下的元素的流;
(4)当n>=length时,跳过所有元素,返回空流。
对于
limit()方法,它是用于限制流中元素的个数,即取前n个元素,返回新的流(1)当
n<0时,抛IllegalArgumentException异常;(2)当
n=0时,不取元素,返回空流;(3)当
0<n<length时,取前n个元素,返回新的流;(4)当
n>=length时,取所有元素,原封不动、完璧归赵。
但是它们有一些区别 skip 操作必须时刻监测流中元素的状态。才能判断是否需要丢弃。所以 skip 属于状态操作。
而 limit 只关心截取的是不是其参数 maxsize (最大区间值),其它毫不关心。一旦达到就立马中断操作返回流。所以 limit 属于一个中断操作。
Stream流的toMap方法
1 | List<SysTemplateData> sysTemplateData = |
one -> one.getValue():指定了作为键的属性。对于每个SysTemplateData对象,这里使用getValue()方法作为键。one -> one:指定了作为值的属性。每个SysTemplateData对象本身作为值。
最终,得到的 templateDataMap 就是一个 Map,其中键是 SysTemplateData 对象的 value 属性,值是对应的 SysTemplateData 对象。
1 | Map<K, V> toMap(Function<? super T, ? extends K> keyMapper, |
keyMapper是一个函数,用于将 Stream 中的元素映射为 Map 的键。valueMapper是一个函数,用于将 Stream 中的元素映射为 Map 的值。
如果存在重复的键(即两个人有相同的名字),toMap 方法默认会抛出 IllegalStateException。为了解决这个问题,我们可以提供一个合并函数,例如:
1 | Map<String, Integer> nameToAgeMap = people.stream() |
Stream流结合Collectors使用
1 | List<PFormulaDetail> uniqueFormulaDetail = pFormulaDetails.stream() |
使用.stream()将列表转换成一个流
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PFormulaDetail::getCode))):使用
Collectors.toCollection将Stream中的元素收集到一个集合中。- 在这里,集合的类型是
TreeSet,它是有序的且不允许重复元素的集合。 - 通过传递一个
Comparator,指定根据PFormulaDetail对象的getCode属性进行比较,从而实现自定义比较逻辑。
- 在这里,集合的类型是
Collectors.collectingAndThen(..., ArrayList::new):- 使用
Collectors.collectingAndThen包装前面的收集器,它接受两个参数:前一个收集器和一个转换函数。 - 前一个收集器是去重的
TreeSet,然后通过转换函数将其转换为ArrayList,这样得到的ArrayList就是去重后的pFormulaDetails列表。
- 使用
Stream流中的filter方法
1 | Object comp = components.stream().filter(item -> { |
filter(item -> {...}):使用filter方法对流中的元素进行筛选,保留符合条件的元素。- 通过Lambda表达式,将
item强制转换为JSONObject,然
后检查其componentsId属性是否与给定的materialCode相等 。
- 通过Lambda表达式,将
findAny():返回流中的任意一个元素,如果流为空则返回空。由于使用了filter进行了筛选,这里找到的元素就是符合条件的任意一个元素。orElse(null):如果找到符合条件的元素,返回该元素;如果没有找到,则返回null
compareTo()方法
1 | public int compareTo(BigDecimal val) |
这个方法返回一个整数值,其含义如下:
- 如果当前对象小于
val,则返回负整数。 - 如果当前对象等于
val,则返回零。 - 如果当前对象大于
val,则返回正整数。
这样的比较是基于数值的大小而不是对象的引用。