我想让我的类返回一个值,但我希望该值能够像循环一样进行更改。我认为我的代码会比我能更好地解释它。
public static String readChat(String value) throws Exception
{
FormatS FormatS = new FormatS();
BufferedReader mainChat = new BufferedReader(new FileReader("./chat.txt"));
String str;
while ((str = mainChat.readLine()) != null)
{
String msg = FormatS.FormatS(str, value);
}
mainChat.close();
return (msg);
不幸的是,只返回最后一个,因为没有返回循环,只返回循环中的最后一条消息,如何让它返回循环中的每个值作为单独的返回? (如果可能,从这里不影响其他类)
答案 0 :(得分:4)
你做不到。 Java方法只返回一个值,它不能多次返回。 在return语句之后,你已经不在那个方法中了!
您可以使用Collection(例如List)来存储所有邮件,然后返回列表。
http://download.oracle.com/javase/6/docs/api/java/util/Collection.html
点击此处查看有关馆藏的更多信息。如果您是Java新手,并计划坚持使用它,那么掌握它是非常关键的方面:)。
您应该做的是实例化一个新的集合,例如:
List<String> messageList = new ArrayList<String>();
然后在你的循环内,你会做...
messageList.add(msg);
对于最后的结局,当然......
return messageList;
在“外部”方法(调用者)中,您可以对列表进行交互,并根据需要使用这些消息。
答案 1 :(得分:2)
创建一个数组,将每个值作为单独的项放在数组中,然后返回该数组。或者将新值附加到循环中的msg:
msg += FormatS.FormatS(str, value);
在循环外启动消息。
答案 2 :(得分:1)
如果你想让方法在每次调用时返回一个不同的东西,你需要存储方法的状态 - 这是一个非常不幸的,因为它是一个静态方法。 / p>
对我而言,感觉更合适的是返回Iterable<String>
- 您可以迭代的单个对象,例如使用增强的for
循环。
这样做的一个简单方法是读取整个文件,将其加载到List<String>
然后返回。 Guava提供了一种非常简单的方法:
// Use the appropriate charset, of course - but the default platform encoding
// is rarely a good idea.
List<String> lines = Files.readLines(new File("chat.txt", Charsets.UTF_8));
List<String> formattedLines = Lists.newArrayList();
for (String line : lines) {
formattedLines.add(FormatS.FormatS(line, value));
}
return formattedLines;
(FormatS.FormatS
是一个非常奇怪的方法名称,顺便说一句......)
在番石榴中有另外的方法可以做到这一点,例如传入LineProcessor
- 但如果你对Java比较新,那可能是一个更简单的起点。
答案 3 :(得分:0)
每次调用都会返回下一行,如果没有更多行,则返回null(如果这是你需要的):
static BufferedReader mainChat = new BufferedReader(new FileReader("./chat.txt"));
static boolean finished = false;
public static String readChat(String value) throws Exception
{
FormatS FormatS = new FormatS();
if(finished) {
return null;
}
String str;
if ((str = mainChat.readLine()) != null)
{
return FormatS.FormatS(str, value);
} else {
finished = true;
mainChat.close();
return null;
}
}
请注意,如果您想多次使用它,则必须创建一个单独的(重新)初始化函数。
答案 4 :(得分:0)
您必须从调用方法重复调用此方法。更好的方法是将内容存储在String数组中并返回数组,而不必多次调用此方法。
private String[] strBuff;
while ((str = mainChat.readLine()) != null)
{
strBuff[i] = FormatS.FormatS(str, value);
}
return strBuff;
答案 5 :(得分:0)
有两种简洁的方法可以让方法将多个返回值传递给调用者。
第一种也是最简单的方法是返回一个包含所有返回值的对象。它可能是一个Collection,就像List一样,或者它可能是你自己的值类的一个对象。
List<Person> matches = findMatches(peopleDB,criteria);
MatchReport report = findMatchesAsReport(peopleDB);
...
public List<Person> findMatches(PersonSource source,Criteria criteria) {
List<Person> list = new ArrayList<Person>();
while(source.hasNext()) {
Person person = source.next();
if(person.matches(criteria)) {
list.add(person);
}
}
return list;
}
第二种更复杂的方法是定义一个处理程序,您的方法可以在遇到项目时将其处理。
public interface PersonHandler {
public void onPerson(Person p);
}
然后定义您的方法,以便将处理程序传递给它:
public void findMatches(PeopleSource source, Criteria criteria, PersonHandler handler) {
while(source.hasNext()) {
Person person = source.next();
if(person.matches(criteria)) {
handler.onPerson(person);
}
}
}
然后调用者可以定义一个PersonHandler,而不是满足他们自己的需要:
private static class PrintToWriterPersonHandler implements PersonHandler {
private PrintWriter writer;
public WriteToStreamPersonHandler(PrintWriter writer) {
this.writer = writer;
}
public void onPerson(Person p) {
writer.println(person);
}
}
...
findMatches(source,criteria,new PrintToWriterPersonHandler(System.out));
这非常复杂,对初学者来说很复杂。但值得记住。这意味着你可以处理产生大量响应的方法,而不必等到方法完成,并且不会在内存中结束巨大的List。它还意味着您可以处理可能无限期运行的方法的输出!