gpt4 book ai didi

java - 使用 Google Guava Collections2.transform 的奇怪之处

转载 作者:搜寻专家 更新时间:2023-11-01 01:18:01 24 4
gpt4 key购买 nike

我不完全确定给这个问题起什么标题才能获得正确的想法。这看起来像是 Java 的小手笔,但它只发生在使用 Guava Collections2.transform 的情况下。转换器在“结果”迭代期间提供了我的对象的一个​​完全不同的实例,然后在“结果”最终返回时包含的内容。因此,“setDateStamp()”实际上似乎不起作用,因为它被设置在似乎只是像幽灵一样出现和消失的实例上。

当我实现 Collections2.transform() 方法的逻辑等效项(注释掉的代码)时,我得到了我期望的结果。我已经遍历了谷歌代码、断点和所有内容,除了我的基础函数之外,没有通过任何方法创建新实例的地方。

我知道他们的实现在做什么:按需转换。不复杂。那为什么这行不通呢?

这是有问题的代码以及一些调试

@Component
public class SurveyResultToQuestionResults implements Function<SurveyResult, Collection<QuestionResult>> {

@Autowired
private QuestionResultDtoToDomain dtoToDomain;

@Override
public Collection<QuestionResult> apply(@Nullable SurveyResult input) {
Collection<QuestionResult> results = new HashSet<QuestionResult>();
if (input != null) {
// substitute this
// for (QuestionResultDto dto : input.getResults()) {
// QuestionResult result = dtoToDomain.apply(dto);
// results.add(result);
// }
// for this
results = Collections2.transform(input.getResults(), dtoToDomain);
for (QuestionResult result : results) {
long time = input.getSurveyTime().getTime();
Timestamp dateStamp = new Timestamp(time);
result.setDateStamp(dateStamp);
}

}
return results;
}
}

下节课

@Component
public class QuestionResultDtoToDomain implements Function<QuestionResultDto, QuestionResult> {

@Override
public QuestionResult apply(@Nullable QuestionResultDto input) {
QuestionResult result = null;
if (input != null)
result = new QuestionResult(input.getAnswerOriginId(),input.getAnswer(),input.getQuestionId());
return result;
}

还有一个测试

@RunWith(MockitoJUnitRunner.class)
public class SurveyTransformerTest {

@Spy
private QuestionResultDtoToDomain dtoToDomain = new QuestionResultDtoToDomain();

@InjectMocks
private SurveyResultToQuestionResults surveyResultToQuestionResults = new SurveyResultToQuestionResults();
@Test
public void testSurveyToQuestionResults() throws Exception {
Set<QuestionResultDto> answers = new HashSet<QuestionResultDto>();
answers.add(new QuestionResultDto(17L,"question 2 answer"));
answers.add(new QuestionResultDto(18L,"question 3 answer"));
answers.add(new QuestionResultDto(19L,"question 4 answer"));
SurveyResult result = new SurveyResult(10L,16L,new Date(),answers);
Collection<QuestionResult> qresults = surveyResultToQuestionResults.apply (result);
System.out.println(qresults);
for (QuestionResult qresult : qresults) {
assertNotNull(qresult.getDateStamp());
}

}
}


Debug:
Bad implementation
[QuestionResult{questionResultId=null, answer='question 4 answer', dateStamp=null}, QuestionResult{questionResultId=null, answer='question 2 answer', dateStamp=null}, QuestionResult{questionResultId=null, answer='question 3 answer', dateStamp=null}]

Good implementation:
[QuestionResult{questionResultId=null, answer='question 4 answer', dateStamp=2012-05-17 00:02:18.615}, QuestionResult{questionResultId=null, answer='question 3 answer', dateStamp=2012-05-17 00:02:18.615}, QuestionResult{questionResultId=null, answer='question 2 answer', dateStamp=2012-05-17 00:02:18.615}]

最佳答案

您对新对象上的写入没有写入后备集合感到惊讶吗?

Collections.transform 不只是“根据需要”进行转换——它根本不存储任何东西。这就是“ View ”在其文档。每当您遍历 Collections2.transformed 集合时,它都会再次 新鲜地应用函数。一旦 apply 方法中的 for 循环用 result 完成,那个对象就消失了;再也见不到了。

如果你想做你正在做的事情,请在例如一个 ArrayList

关于java - 使用 Google Guava Collections2.transform 的奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com