如何避免在 Java 中重复 for 循环?
How to avoid repeatng for loops in Java?
我有一个代码可以正常工作,但它看起来太大了,因为它有重复的代码行,有人可以帮我把它缩短吗?
public void writeToFile(String file)
{
try
{
PrintWriter pWrite = new PrintWriter(file);
pWriter.println("[Auto data]");
for (Auto line : autoMap.values())
{
if (line instanceof Auto)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Nature data]");
for (Nature line : natureMap.values())
{
if (line instanceof Nature)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Sport data]");
for (Sport line : sportMap.values())
{
if (line instanceof Sport)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Animal data]");
for (Animal line : animalMap.values())
{
if (line instanceof Animal)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWrite.close();
}
// catch block omitted
}
writeData 方法示例 class Sport:
public class Sport
{
// codes omitted
public String writeData(String file)
{
return title + type + cost + location;
}
// codes omitted
}
正如您所注意到的,for 循环对于在写入文件时按顺序细分数据是必要的,但这样做会使代码变得更长和重复,我想不出一种有效的方法来缩短它。
这是一个 classic 案例,您可以利用接口和继承。特别是,我会定义一个所有 class 都可以继承的接口。
然后,我将在 writeToFile
所在的 class 中定义一个私有方法,它仅在给定的 Line
.
[ 上实现 for 循环=15=]
最后,您只需在 writeToFile
中为每个地图调用该方法即可。然而,我会稍微改变一下实现,因为最好的做法是使用 try-with-resource 块,它保证在离开块之前始终关闭流,即使在可能出现异常的情况下也是如此。
为了让您了解我所指的内容,这里有一个可能的实施示例:
import java.util.*;
import java.io.*;
interface Line {
String getType();
default void writeData(PrintWriter pWrite) {
pWrite.println("I am a " + getType());
}
}
class Auto implements Line {
public String getType() {
return "Auto";
}
}
class Sport implements Line {
public String getType() {
return "Sport";
}
}
class Animal implements Line {
public String getType() {
return "Animal";
}
}
public class Test {
private Map<String, Line> itemMap;
public Test() {
initMap();
}
private void initMap() {
itemMap = new HashMap<>();
itemMap.put("auto1", new Auto());
itemMap.put("sport1", new Sport());
itemMap.put("animal1", new Animal());
}
public static void main(String ... args) throws IOException {
new Test().writeToFile("Test.txt");
}
public void writeToFile(String file) throws IOException {
try (PrintWriter pWrite = new PrintWriter(file);) {
writeLineToFile(pWrite, itemMap);
}
// catch block omitted
}
private void writeLineToFile(PrintWriter pWrite, Map<String, Line> map) {
for (Line line : map.values()) {
//Common part
line.writeData(pWrite);
}
}
}
文件内容如下:
I am a Sport
I am a Animal
I am a Auto
在我看来,它看起来更干净,也更容易维护。
当然,这只是一个想法,您可以根据需要进行个性化和添加更多的东西,尤其是利用继承,可能性是无限的。
确保 Nature
、Sport
和 Animal
都实现一个接口,例如:
public interface Writable {
public String writeData(String file);
}
并且由于每个 Map 的所有元素都实现了接口,因此可以提取重复代码,并将 Map 传递给使用该接口的新方法:
public void writeToFile(String file) {
PrintWriter pWriter = new PrintWriter(file);
pWriter.println("[Auto data]");
writeDataToFile(file, pWriter, autoMap);
pWriter.println();
pWriter.println("[Nature data]");
writeDataToFile(file, pWriter, natureMap);
pWriter.println();
pWriter.println("[Animal data]");
writeDataToFile(file, pWriter, animalMap);
pWrite.close();
}
// assuming the map key is a string
private void writeDataToFile(String file, PrintWriter pWriter, Map<String, Writable> data) {
for (Writable line : data.values()) {
String getLine = line.writeData(file);
pWriter.println(getLine);
}
}
我有一个代码可以正常工作,但它看起来太大了,因为它有重复的代码行,有人可以帮我把它缩短吗?
public void writeToFile(String file)
{
try
{
PrintWriter pWrite = new PrintWriter(file);
pWriter.println("[Auto data]");
for (Auto line : autoMap.values())
{
if (line instanceof Auto)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Nature data]");
for (Nature line : natureMap.values())
{
if (line instanceof Nature)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Sport data]");
for (Sport line : sportMap.values())
{
if (line instanceof Sport)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWriter.println();
pWriter.println("[Animal data]");
for (Animal line : animalMap.values())
{
if (line instanceof Animal)
{
String getLine = line.writeData(file);
pWrite.println(getLine);
}
}
pWrite.close();
}
// catch block omitted
}
writeData 方法示例 class Sport:
public class Sport
{
// codes omitted
public String writeData(String file)
{
return title + type + cost + location;
}
// codes omitted
}
正如您所注意到的,for 循环对于在写入文件时按顺序细分数据是必要的,但这样做会使代码变得更长和重复,我想不出一种有效的方法来缩短它。
这是一个 classic 案例,您可以利用接口和继承。特别是,我会定义一个所有 class 都可以继承的接口。
然后,我将在 writeToFile
所在的 class 中定义一个私有方法,它仅在给定的 Line
.
[ 上实现 for 循环=15=]
最后,您只需在 writeToFile
中为每个地图调用该方法即可。然而,我会稍微改变一下实现,因为最好的做法是使用 try-with-resource 块,它保证在离开块之前始终关闭流,即使在可能出现异常的情况下也是如此。
为了让您了解我所指的内容,这里有一个可能的实施示例:
import java.util.*;
import java.io.*;
interface Line {
String getType();
default void writeData(PrintWriter pWrite) {
pWrite.println("I am a " + getType());
}
}
class Auto implements Line {
public String getType() {
return "Auto";
}
}
class Sport implements Line {
public String getType() {
return "Sport";
}
}
class Animal implements Line {
public String getType() {
return "Animal";
}
}
public class Test {
private Map<String, Line> itemMap;
public Test() {
initMap();
}
private void initMap() {
itemMap = new HashMap<>();
itemMap.put("auto1", new Auto());
itemMap.put("sport1", new Sport());
itemMap.put("animal1", new Animal());
}
public static void main(String ... args) throws IOException {
new Test().writeToFile("Test.txt");
}
public void writeToFile(String file) throws IOException {
try (PrintWriter pWrite = new PrintWriter(file);) {
writeLineToFile(pWrite, itemMap);
}
// catch block omitted
}
private void writeLineToFile(PrintWriter pWrite, Map<String, Line> map) {
for (Line line : map.values()) {
//Common part
line.writeData(pWrite);
}
}
}
文件内容如下:
I am a Sport
I am a Animal
I am a Auto
在我看来,它看起来更干净,也更容易维护。
当然,这只是一个想法,您可以根据需要进行个性化和添加更多的东西,尤其是利用继承,可能性是无限的。
确保 Nature
、Sport
和 Animal
都实现一个接口,例如:
public interface Writable {
public String writeData(String file);
}
并且由于每个 Map 的所有元素都实现了接口,因此可以提取重复代码,并将 Map 传递给使用该接口的新方法:
public void writeToFile(String file) {
PrintWriter pWriter = new PrintWriter(file);
pWriter.println("[Auto data]");
writeDataToFile(file, pWriter, autoMap);
pWriter.println();
pWriter.println("[Nature data]");
writeDataToFile(file, pWriter, natureMap);
pWriter.println();
pWriter.println("[Animal data]");
writeDataToFile(file, pWriter, animalMap);
pWrite.close();
}
// assuming the map key is a string
private void writeDataToFile(String file, PrintWriter pWriter, Map<String, Writable> data) {
for (Writable line : data.values()) {
String getLine = line.writeData(file);
pWriter.println(getLine);
}
}