Stream流的skip方法

1
2
//分页显示
List<Map<String, Object>> resultList = list.stream().skip((long) pageSize * (pageNo - 1)).limit(pageSize).collect(Collectors.toList());
  • 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
2
3
4
5
List<SysTemplateData> sysTemplateData =
sysTemplateDataMapper.selectByExample(sysTemplateDataExample);
Map<String, SysTemplateData> templateDataMap =
sysTemplateData.stream()
    .collect(Collectors.toMap(one -> one.getValue(), one -> one));
  • one -> one.getValue():指定了作为键的属性。对于每个 SysTemplateData 对象,这里使用 getValue() 方法作为键。
  • one -> one:指定了作为值的属性。每个 SysTemplateData 对象本身作为值。

最终,得到的 templateDataMap 就是一个 Map,其中键是 SysTemplateData 对象的 value 属性,值是对应的 SysTemplateData 对象。

1
2
Map<K, V> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends V> valueMapper);
  • keyMapper 是一个函数,用于将 Stream 中的元素映射为 Map 的键。
  • valueMapper 是一个函数,用于将 Stream 中的元素映射为 Map 的值。

如果存在重复的键(即两个人有相同的名字),toMap 方法默认会抛出 IllegalStateException。为了解决这个问题,我们可以提供一个合并函数,例如:

1
2
3
4
5
Map<String, Integer> nameToAgeMap = people.stream()
.collect(Collectors.toMap(
person -> person.getName(),
person -> person.getAge(),
(existing, replacement) -> existing // 合并函数,选择保留已存在的值 ));

Stream流结合Collectors使用

1
2
3
4
5
List<PFormulaDetail> uniqueFormulaDetail = pFormulaDetails.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(PFormulaDetail::getCode))),
ArrayList::new));));
  • 使用.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
2
3
4
Object comp = components.stream().filter(item -> {
JSONObject obj = (JSONObject) item;
return materialCode.equals(obj.get("componentsId"));
}).findAny().orElse(null);
  • filter(item -> {...}):使用filter方法对流中的元素进行筛选,保留符合条件的元素。

    • 通过Lambda表达式,将item强制转换为JSONObject,然
      后检查其componentsId属性是否与给定的materialCode相等 。
  • findAny():返回流中的任意一个元素,如果流为空则返回空。由于使用了filter进行了筛选,这里找到的元素就是符合条件的任意一个元素。

  • orElse(null):如果找到符合条件的元素,返回该元素;如果没有找到,则返回null

compareTo()方法

1
public int compareTo(BigDecimal val)

这个方法返回一个整数值,其含义如下:

  • 如果当前对象小于 val,则返回负整数。
  • 如果当前对象等于 val,则返回零。
  • 如果当前对象大于 val,则返回正整数。

这样的比较是基于数值的大小而不是对象的引用。