获取Map上下文的位置

时间:2017-12-30 09:55:35

标签: java list hashmap spring-batch

我正在尝试使用HashMap创建一个自定义Itemreader,这里是一个eaxmple,我发现它使用的是一个使用列表而不是HashMap的itemReader

#welcome

正如你在这里看到的,我们可以通过它的位置(索引)迭代一个列表,所以当我们下次调用方法read()时,我们保证我们得到下一个元素。

但在我的情况下,没有索引的概念,因为HashMap没有位置的概念,因此无法按位置获取对象。

haw可以更新此代码以使用我的案例:

public class InMemoryStudentReader implements ItemReader<StudentDTO> {

    private int nextStudentIndex;
    private List<StudentDTO> studentData;

    InMemoryStudentReader() {
        initialize();
    }

    private void initialize() {
        StudentDTO tony = new StudentDTO();
        tony.setEmailAddress("tony.tester@gmail.com");
        tony.setName("Tony Tester");
        tony.setPurchasedPackage("master");

        StudentDTO nick = new StudentDTO();
        nick.setEmailAddress("nick.newbie@gmail.com");
        nick.setName("Nick Newbie");
        nick.setPurchasedPackage("starter");

        StudentDTO ian = new StudentDTO();
        ian.setEmailAddress("ian.intermediate@gmail.com");
        ian.setName("Ian Intermediate");
        ian.setPurchasedPackage("intermediate");

        studentData = Collections.unmodifiableList(Arrays.asList(tony, nick, ian));
        nextStudentIndex = 0;
    }

    @Override
    public StudentDTO read() throws Exception {
        StudentDTO nextStudent = null;

        if (nextStudentIndex < studentData.size()) {
            nextStudent = studentData.get(nextStudentIndex);
            nextStudentIndex++;
        }

        return nextStudent;
    }
}

我是否需要将hashMap更改为LinkedHashMap或将地图转换为List?

2 个答案:

答案 0 :(得分:0)

如果您不想在实现中使用任何类型的索引,那么可以在循环中编写read(idx),其中read()将被称为idx次。

答案 1 :(得分:0)

没有像0,1,... n这样的索引,但您可以按特定顺序使用密钥(例如字母排序)。另一种方法是通过调用yourHashMap.keySet()。iterator()获取Iterator对象,并将该对象用作class-attribute而不是nextStudentIndex属性。然后使用如下代码段:

if (yourIterator.hasNext()) return yourHashMap.get(youtIterator.next());
else return null;