如何在forEach方法中使用final变量?Java代码报错解决方案
问题解决办法
问题核心是:final修饰的String变量不能被重新赋值,而且String本身是不可变的,concat()会返回新的字符串对象,你试图把新对象赋值给final变量,自然报错。既然不能移除final,可以用可变的字符串容器来替代String,比如StringBuilder——因为final修饰StringBuilder变量时,只是限制变量本身不能指向新对象,但你可以修改它内部的字符串内容,完全符合要求。
修改后的代码如下:
final List<String> categoryCodeProductTypes = new ArrayList<>(); List<Uda> uda4 = udas.stream() .filter(a -> a.getCode().equals(Uda_Code)) .collect(Collectors.toList()); uda4.stream() .forEach(a -> { // 用final修饰StringBuilder变量,符合你不能移除final的要求 final StringBuilder categoryCodeProductType = new StringBuilder(); a.getReferences() .stream() .forEach(b -> categoryCodeProductType.append(b.getCode())); // 最后转成String加入列表 categoryCodeProductTypes.add(categoryCodeProductType.toString()); }); return categoryCodeProductTypes;
额外优化(可选)
其实可以把嵌套的流式操作简化,用Collectors.joining()直接拼接字符串,代码更简洁,同时依然保留final的约束(甚至可以省略中间变量):
final List<String> categoryCodeProductTypes = udas.stream() .filter(a -> a.getCode().equals(Uda_Code)) .map(a -> a.getReferences().stream() .map(b -> b.getCode()) .collect(Collectors.joining())) .collect(Collectors.toList()); return categoryCodeProductTypes;
这个版本里没有需要修改的final变量,直接通过流式操作完成拼接和收集,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Mohammed Muntazim
相关产品推荐
相关产品推荐

