与这篇文章相关的帖子太多了,我认为引用它们没有帮助,但如果人们发现特别有用的帖子,那么将它们添加到这里就太好了。
ArrayList<Integer> readIntegersFrom(Scanner scnr) {
ArrayList<Integer> lst = new ArrayList<Integer>();
while (scnr.hasNext()) {
lst.add(scnr.nextInt());
}
return lst;
}
整数出现在4个位置:
- 方法的名称
- ArrayList返回类型的Type参数
- lst类型的Type参数
- 用于创建新列表的Type参数
到目前为止还不错。然而,我的程序将这种方法复制了四次(我相信还会有更多(,每次都有不同的类型参数和Scanner方法。(例如,ArrayList<Double>
和scnr.nextDouble()
。(
我毫不怀疑我混淆了我使用过的许多其他语言的思想和技术,但有没有办法推广这种方法,这样我就可以告诉它我想要一个ArrayList,比如Double,它应该使用Scanner.nextDouble((?这个问题的两个部分是(a(传递ArrayList的类型参数和(b(传递要使用的Scanner方法。
我会选择指定或推导类型参数的单个方法,并有一个枚举参数来告诉扫描仪要使用哪种方法,尽管两者直接相连。
您需要提供额外的参数,例如:
<T> ArrayList<T> readFrom(BooleanSupplier hasNext, Supplier<T> supplier) {
ArrayList<T> lst = new ArrayList<>();
while (hasNext.getAsBoolean()) {
lst.add(supplier.get());
}
return lst;
}
然后调用类似:
ArrayList<Integer> intList = readFrom(scnr::hasNextInt, scnr::nextInt);
ArrayList<Double> doubleList = readFrom(scnr::hasNextDouble, scnr::nextDouble);
ArrayList<String> stringList = readFrom(scnr::hasNext, scnr::next);
如果你不想在每个呼叫站点都有这样的方法,你可以定义简单的辅助方法:
ArrayList<Integer> readIntegersFrom(Scanner scnr) {
return readFrom(scnr::hasNextInt, scnr::nextInt);
}
ArrayList<Double> readDoublesFrom(Scanner scnr) {
return readFrom(scnr::hasNextDouble, scnr::nextDouble);
}
// etc
并调用类似:
ArrayList<Integer> intList = readIntegersFrom(scnr);
ArrayList<Double> doubleList = readDoublesFrom(scnr);