Java Stream用法汇总

本文分享了Java开发者在处理BigDecimal数据时的stream操作技巧,包括汇总、分组以及多个字段组合,帮助读者理解如何优雅地处理数值计算和数据整理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是个人开发Java代码时候,使用的一些stream方法,做记录方便查询。

stream对BigDecimal汇总

注意,如果不加过滤条件,可能出现空指针错误

 BigDecimal totalAmount = hzPropertyList.stream()
                    .filter(item -> item.getAmount() != null)
                    .map(HzProperty::getAmount)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);

stream对BigDecimal按单个分组汇总

   Map<String, BigDecimal> companyPropertyMap = hzPropertyList.stream() 
                .collect(Collectors.groupingBy(
                        HzProperty::getCodeCompany,
                        Collectors.reducing(BigDecimal.ZERO, HzProperty::getAmount, BigDecimal::add))

stream多个字段分组

Map<String, List<HzProperty>> companyPropertyMap = hzPropertyList.stream()
                .collect(Collectors.groupingBy(hzProperty -> String.format("%s#%s", hzProperty.getCodeCompany(), hzProperty.getCurrencyCode())));

stream按数量拆分成多个List

List<String> sourceLineIds = new ArrayList<>(map.keySet());    
long splitSize = 1000;
int maxSize = (int) Math.ceil((double) sourceLineIds.size() / (double) splitSize);
List<List<String>> sourceLineIdsList = Stream.iterate(0, n -> n + 1)
                .limit(maxSize)
                .map(a -> sourceLineIds.stream().skip(a * splitSize).limit(splitSize).collect(Collectors.toList()))
                .collect(Collectors.toList());

 stream查找最大值所在的行

adjustJeLine = jeLineList.stream()
                            .filter(jeLine -> jeLine.getAccountedDr() != null)
                            .max(Comparator.comparing(jeLine -> jeLine.getAccountedDr().abs()))
                            .orElse(new JeLine());

 stream对List<Interger>汇总

int sum =  list.stream().mapToInt(Integer::intValue).sum();

### Java Stream API 汇总教程 #### 创建Stream Java中的Stream可以通过多种方式创建。最常见的方式是从集合类创建流,也可以从数组或者通过静态工厂方法`Stream.of()`来创建[^1]。 ```java List<String> list = Arrays.asList("a", "b", "c"); Stream<String> streamFromCollection = list.stream(); String[] array = {"d", "e", "f"}; Stream<String> streamFromArray = Stream.of(array); ``` #### 中间操作 中间操作是指那些返回新流的操作,它们本身不会触发实际的数据处理过程。常见的中间操作有: - `filter(Predicate)`:用于筛选符合条件的元素。 - `map(Function)`:将每个输入元素按照指定函数映射成新的形式。 - `flatMap(Function)`:先对每个元素应用一个函数,再把结果展平到一个新的流中[^2]。 ```java // 过滤长度大于3的字符串并将其转为大写 stream.filter(s -> s.length() > 3).map(String::toUpperCase) ``` #### 终端操作 终端操作会启动流的实际执行流程,并通常会产生某种类型的最终结果或副作用。一旦调用了任何终端操作之后就不能再次使用该流了。重要的终端操作包括但不限于: - `forEach(Consumer)`:遍历流中的每一个元素。 - `collect(Collector)`:收集流的结果至列表、集合或其他容器结构。 - `reduce(BinaryOperator)`:累积计算得到单个值作为结果。 ```java // 收集所有元素到列表 List<String> result = stream.collect(Collectors.toList()); // 计算整数流的最大值 Optional<Integer> max = integerStream.reduce(Integer::max); ``` #### 并行处理 除了顺序处理外,还可以利用多核处理器的优势来进行并行化处理。只需简单地调用`.parallel()`即可开启并行模式;而要恢复串行则可以调用`.sequential()`。 ```java list.parallelStream().forEach(System.out::println); // 并行打印 ``` #### 特殊情况下的优化建议 当面对大量数据时,应该考虑如何有效地减少不必要的内存占用以及提升性能表现。例如,在不需要整个序列的情况下尽早终止迭代(如findFirst),合理设置缓冲区大小等措施都能带来显著的效果改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值