Java返回一个循环

时间:2011-10-17 21:10:01

标签: java loops return

我想让我的类返回一个值,但我希望该值能够像循环一样进行更改。我认为我的代码会比我能更好地解释它。

    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);

不幸的是,只返回最后一个,因为没有返回循环,只返回循环中的最后一条消息,如何让它返回循环中的每个值作为单独的返回? (如果可能,从这里不影响其他类)

6 个答案:

答案 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);
             }
          }
    }

然后调用者可以定义一个PersonH​​andler,而不是满足他们自己的需要:

   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。它还意味着您可以处理可能无限期运行的方法的输出!