我正在研究逻辑,我必须在其中使用PersonDto列表,并根据PersonDto中存在的规则值(private String rule;)应用规则。
我有一个名为Rules的接口,它将有多个实现。但是对于这个问题,我仅添加了一个名为Rule1。]的实现。
我还有一个RuleMapper
类,该类负责按需提供bean。问题:
基于PersonDto中存在的规则值,我正在应用规则。在Rule1类中,我具有修改id字段的逻辑。我正在设置新的id作为参数。最后,我将结果存储到ArrayList中。但是在ArrayList中,所有PersonDto的值都将作为我应用规则时传递的最后一个id值来。例如:
和10002,但是当我存储然后打印结果时,我会得到带有id]的PersonDto所有元素中的>值都为10002。但是,当我在循环内执行System.out.println()时,我会看到正确的结果。List<String> ids = Arrays.asList("10001", "100002"); List<PersonDto> result = new ArrayList<PersonDto>(); persons.stream().forEach(person -> { ids.stream().forEach(id -> { System.out.println(ruleMapper.getRule(person.getRule()).applyRule(person, id)); result.add(ruleMapper.getRule(person.getRule()).applyRule(person, id)); }); });
您可以在上面的代码片段中看到,有两个id 10001
有关更多信息或重现该问题,请参考下面的完整代码:
PersonDto
package com.example.dto; public class PersonDto { protected int id; protected String name; private String rule; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRule() { return rule; } public void setRule(String rule) { this.rule = rule; } @Override public String toString() { return "PersonDto [id=" + id + ", name=" + name + ", rule=" + rule + "]"; } }
规则界面
package com.example.service; import com.example.dto.PersonDto; public interface Rules { public PersonDto applyRule(PersonDto input, String newId); }
规则1实现
package com.example.service; import org.springframework.stereotype.Service; import com.example.dto.PersonDto; @Service public class Rule1 implements Rules { @Override public PersonDto applyRule(PersonDto input, String newIdt) { input.setId(Integer.parseInt(newIdt)); return input; } }
RuleMapper
package com.example.service; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service
公共类RuleMapper {
@Autowired private Map<String, Rules> beans; public Rules getRule(String ruleName) { return beans.get(ruleName); } public Map<String, Rules> gelAllBeans() { return beans; } }
Controller
package com.example.demo; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.example.dto.PersonDto; import com.example.service.RuleMapper; @RestController public class StudentContoller { @Autowired private RuleMapper ruleMapper; @GetMapping(value = "/test") public void saveStudent() throws Exception { List<String> orders = Arrays.asList("order 1", "order 2"); List<PersonDto> persons = new ArrayList<PersonDto>(); for (int i = 0; i < 10; i++) { PersonDto per = new PersonDto(); per.setId(i); per.setName("John Doe_ ".concat(String.valueOf(i))); per.setRule("rule" + getRandomRule()); persons.add(per); } List<String> ids = Arrays.asList("10001", "100002"); List<PersonDto> result = new ArrayList<PersonDto>(); persons.stream().forEach(person -> { ids.stream().forEach(id -> { System.out.println(ruleMapper.getRule(person.getRule()).applyRule(person, id)); result.add(ruleMapper.getRule(person.getRule()).applyRule(person, id)); }); }); for (PersonDto person : result) { System.out.println(person); } } private int getRandomRule() { Random r = new Random(); int low = 1; int high = 2; int result = r.nextInt(high - low) + low; return result; } }
预期输出
PersonDto [id=10001, name=John Doe_ 0, rule=rule1] PersonDto [id=100002, name=John Doe_ 0, rule=rule1] PersonDto [id=10001, name=John Doe_ 1, rule=rule1] PersonDto [id=100002, name=John Doe_ 1, rule=rule1] PersonDto [id=10001, name=John Doe_ 2, rule=rule1] PersonDto [id=100002, name=John Doe_ 2, rule=rule1] PersonDto [id=10001, name=John Doe_ 3, rule=rule1] PersonDto [id=100002, name=John Doe_ 3, rule=rule1] PersonDto [id=10001, name=John Doe_ 4, rule=rule1] PersonDto [id=100002, name=John Doe_ 4, rule=rule1] PersonDto [id=10001, name=John Doe_ 5, rule=rule1] PersonDto [id=100002, name=John Doe_ 5, rule=rule1] PersonDto [id=10001, name=John Doe_ 6, rule=rule1] PersonDto [id=100002, name=John Doe_ 6, rule=rule1] PersonDto [id=10001, name=John Doe_ 7, rule=rule1] PersonDto [id=100002, name=John Doe_ 7, rule=rule1] PersonDto [id=10001, name=John Doe_ 8, rule=rule1] PersonDto [id=100002, name=John Doe_ 8, rule=rule1] PersonDto [id=10001, name=John Doe_ 9, rule=rule1] PersonDto [id=100002, name=John Doe_ 9, rule=rule1]
实际输出
PersonDto [id=100002, name=John Doe_ 0, rule=rule1] PersonDto [id=100002, name=John Doe_ 0, rule=rule1] PersonDto [id=100002, name=John Doe_ 1, rule=rule1] PersonDto [id=100002, name=John Doe_ 1, rule=rule1] PersonDto [id=100002, name=John Doe_ 2, rule=rule1] PersonDto [id=100002, name=John Doe_ 2, rule=rule1] PersonDto [id=100002, name=John Doe_ 3, rule=rule1] PersonDto [id=100002, name=John Doe_ 3, rule=rule1] PersonDto [id=100002, name=John Doe_ 4, rule=rule1] PersonDto [id=100002, name=John Doe_ 4, rule=rule1] PersonDto [id=100002, name=John Doe_ 5, rule=rule1] PersonDto [id=100002, name=John Doe_ 5, rule=rule1] PersonDto [id=100002, name=John Doe_ 6, rule=rule1] PersonDto [id=100002, name=John Doe_ 6, rule=rule1] PersonDto [id=100002, name=John Doe_ 7, rule=rule1] PersonDto [id=100002, name=John Doe_ 7, rule=rule1] PersonDto [id=100002, name=John Doe_ 8, rule=rule1] PersonDto [id=100002, name=John Doe_ 8, rule=rule1] PersonDto [id=100002, name=John Doe_ 9, rule=rule1] PersonDto [id=100002, name=John Doe_ 9, rule=rule1]
我正在研究逻辑,在该逻辑中,我必须使用PersonDto列表,并根据PersonDto中存在的规则值(私有字符串规则;)应用规则。我有一个称为“规则”的接口,该接口...
persons.stream().forEach(person -> { ids.stream().forEach(id -> { result.add(ruleMapper.getRule(person.getRule()).applyRule(person, id)); }); });
此循环遍历所有人。对于每个人,它遍历所有ID。对于每个ID,您都将规则应用于此人。但是由于规则包含修改人员的ID,因此最后一个ID是人员中存储的ID。