如何创建含N-1个相同对象+1个不同对象的List<T>?解决Collections.nCopies限制
如何创建包含N-1个相同对象+1个不同对象的可变List
嘿,这个问题我之前也踩过坑!Collections.nCopies()确实能快速生成重复元素的集合,但它返回的是不可变的固定大小视图(本质是ImmutableList),所以没法直接调用add()或者修改元素。下面给你几种可读性拉满的实现方式,挑最顺手的用就行:
方案1:先转成可变列表再加元素(最直观易懂)
这应该是逻辑最清晰的方式——先把nCopies生成的不可变集合包装成可变的ArrayList,再添加那个独特的对象:
// 示例:创建包含5个元素的列表,其中4个是sameObj,1个是diffObj int N = 5; T sameObj = ...; // 你的重复对象 T diffObj = ...; // 你的独特对象 List<T> resultList = new ArrayList<>(Collections.nCopies(N - 1, sameObj)); resultList.add(diffObj);
这种写法的优势在于“一看就懂”:先搞定N-1个重复项,再塞进去那个不一样的,哪怕是刚接触Java的开发者也能瞬间明白逻辑。
方案2:用Stream API构建(灵活适配复杂场景)
如果你习惯用Stream风格的代码,也可以用流拼接的方式实现,可读性同样在线,尤其适合后续还要对列表做其他流式操作的场景:
List<T> resultList = Stream.concat( Collections.nCopies(N - 1, sameObj).stream(), Stream.of(diffObj) ).collect(Collectors.toList());
这里通过Stream.concat()把重复元素的流和单个独特元素的流拼合,最后收集成列表,逻辑链条同样清晰。
重要提醒:对象引用的坑
要注意:Collections.nCopies()生成的列表里,所有“相同对象”都是同一个引用。如果你的T是可变对象(比如自定义的实体类),后续修改其中一个元素会影响列表里所有的重复项!如果需要每个重复元素都是独立的实例,得换个方式生成,比如用循环或Stream创建新对象:
// 每个重复元素都是新实例的场景 List<T> resultList = IntStream.range(0, N - 1) .mapToObj(i -> new T(...)) // 每次循环创建新对象 .collect(Collectors.toList()); resultList.add(diffObj);
内容的提问来源于stack exchange,提问作者Alex Kokorin
相关产品推荐
相关产品推荐

