繁体   English   中英

如何创建返回字符串或 ArrayList 的 java 泛型方法<string></string>

[英]how to create java generic method which returns String or ArrayList<String>

作为自我提升的一部分,我正在 java 中练习 generics,我有一个案例 - 这只是一个学习案例 - 不是真实世界的场景......我正在尝试编写一个采用字符串的通用方法作为参数并基于返回类型,它应该返回字符串或列表。

在正常(简单的逻辑)情况下,我已经这样做了:

public class ConfigFile{

    String fileName;

    public ConfigFile(String filename) {
        this.fileName = filename;
    }

    public String getFilename() {
        return fileName;
    }

    public String readFileAndReturnString() {
        String content = "";
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File(this.fileName)));
            String line;

            while ((line = br.readLine()) != null) {
                content = content.concat(line + "\n");
            }
        } catch (IOException e) {
            System.out.println("== IO exception");
            e.printStackTrace();
        }
        return content;

    }

    public ArrayList<String> readFileAndReturnStringArr(String filename) {
        List<String> content = new ArrayList<>();
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File(this.fileName)));
            String line;

            while ((line = br.readLine()) != null) {
                content.add(line);
            }
        } catch (IOException e) {
            System.out.println("== IO exception");
            e.printStackTrace();
        }
        return content;
    }
}

我可以轻松地测试它们:

...
@Test
public void printStringTest() {
    String someStrFile = configFile.readFileAndReturnString();  
    System.out.println(String.format("==== str: %s", someStrFile));
}
    
@Test
public void printArrayTest() {
    ArrayList<String> someArrFile = configFile.readFileAndReturnStringArr();
    for (String line : someArrFile) {
        System.out.println(String.format("arr: %s", line));
    }
}
...

现在我想制作一个通用方法,它将两种方法的逻辑合并,我不知道如何实现这一点(如果可能的话)

    public <T> T readTheFile() {
   //     ...implementation
    }

像这样使用它:

ConfigFile someConfFile = new ConfigFile("C:\\temp\\someFile.txt");
String strConfFile = someConfFile.readTheFile(); //to return here String
ArrayList<String> arrConfFile = someConfFile.readTheFile(); //to return here ArrayList<String>

我尝试了几件事,但我失败了。 你能帮我弄清楚吗? 或者对于这种情况可能还有其他解决方案,或者它完全没有意义

提前致谢

您实际上不必使用 generics,而只需将您拥有的通用代码提取到另一种方法中(稍微修改代码以使用现代成语):

public void readFileInto(Consumer<? super String> accumulator) {
    try(BufferedReader br = new BufferedReader(new FileReader(new File(this.fileName)))) {
        
        String line;
        while ((line = br.readLine()) != null) {
            accumulator.accept(line);
        }
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}

然后其他两种方法可以委托给:

public String readFileAndReturnString() {
    StringBuilder sb = new StringBuilder();
    readFileInto(sb::append);
    return sb.toString();
}

public ArrayList<String> readFileAndReturnStringArr(String filename) {
    ArrayList<String> list = new ArrayList<>();
    readFileInto(list::add);
    return list;
}

如果您在 lambdas 和方法引用方面不明智,看起来像这样:

  • foo -> bar(foo)
  • this::bar
  • Baz::bar

那么我建议阅读以下文章: Lambda 表达式

您应该在java.nio.Files这样的文件中使用标准库 API。

public String readFileAndReturnString() throws IOException {
    return Files.readString(Paths.get(this.fileName));
}

public List<String> readFileAndReturnStringArr() throws IOException {
    return Files.readAllLines(Paths.get(this.fileName));
}

抛出IOException时返回空字符串或空列表是一种糟糕的设计。 因为您无法区分读取空文件。 您应该显式地退回IOException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM