簡體   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