Java如何将Set集合内指定值替换为从列表中随机抽取的值
问题根因
你写的代码未生效是因为Java Stream是惰性求值API,仅当调用终端操作(如forEach、collect、count等)时,中间定义的转换逻辑才会真正执行。你当前只声明了map、flatMap、filter等中间操作,没有触发执行的终端操作,所以所有setCountryValue的修改逻辑根本没有运行,自然不符合预期。
最简实现代码
仅需做两处小改动即可:1、将修改属性的map操作替换为终端操作forEach;2、把Random实例移到循环外避免重复创建对象,性能更优。
// 变量名调整为小驼峰符合Java编码规范 List<String> countryChecker = Arrays.asList("A", "B", "C"); List<String> allowedCountryList = Arrays.asList("L", "M", "N", "O", "P", "R", "S"); Random random = new Random(); obj.getSomeSet().stream() .map(CountryUnit::getCountries) .flatMap(Set::stream) .filter(x -> countryChecker.contains(x.getCountryValue())) .forEach(y -> { int rCountry = random.nextInt(allowedCountryList.size()); y.setCountryValue(allowedCountryList.get(rCountry)); }); // 直接返回obj即可,修改的是对象内部属性,原引用不变 return obj;
可选优化点
- 并发场景下可以用
ThreadLocalRandom替代Random,性能更高且线程安全:int rCountry = ThreadLocalRandom.current().nextInt(allowedCountryList.size()); - 如果业务要求替换后的值不能和旧值相同,可以在赋值前加一层循环判断,直到随机到和旧值不同的结果再赋值。
内容的提问来源于stack exchange,提问作者dsp
相关产品推荐
相关产品推荐

