编译阶段stream 抛StackOverflowError

本文探讨了在Java编程中遇到StackOverflowError的问题,通过一个具体的小程序实例展示了如何因Stream操作引发此类错误。关键原因在于max操作后的额外计算导致无限递归。解决方案包括避免在stream操作后立即进行计算或在map阶段使用getter方法。了解这个问题对于防止类似的运行时错误至关重要。
摘要由CSDN通过智能技术生成

问题描述:

今天在代码build的时候莫名其妙产生了一个StackOverflowError的错误,找了许久才发现是Stream的写法大致的

原因分析:

问题大致可以用这个小程序复现

private static final Config[] CONFIGS = {
new Config(1),
new Config(2),
new Config(3),
new Config(4),
new Config(5),
new Config(6),
new Config(7),
new Config(8),
new Config(9),
};
/*会报StackOverflowError*/
private static final int MAX_INDEX = Arrays.stream(CONFIGS).mapToInt(c -> c.index).max().orElse(1) + 1;
/*不会报StackOverflowError*/
// private static final int MAX_INDEX = Arrays.stream(CONFIGS).mapToInt(Config::getIndex).max().orElse(1) + 1;
/*不会报StackOverflowError*/
// private static final int MAX_INDEX = Arrays.stream(CONFIGS).mapToInt(c -> c.index).max().orElse(1);
 
public static void main(String[] args) {
System.out.println(MAX_INDEX);
}
 
static class Config {
int index;
 
public Config(int index) {
this.index = index;
}
 
public int getIndex() {
return index;
}
}

解决方案:

stream的max或min操作,后面不要加任何操作,如+1等
或者在map的时候用get()去拿,而不是直接调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值