问题描述:
今天在代码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()去拿,而不是直接调用