[英]JAVA - How to access variables inside a FOR loop, from outside the for loop
我的代碼是將RSS提要添加到列表中 - 最初的代碼只是從列表中的第一個位置提取一個提要,並將此對象添加到另一個列表中。
這是原始代碼:
public static List<Feed> getFeedsFromXml(String xml) {
Pattern feedPattern = Pattern.compile("<feed>\\s*<name>\\s*([^<]*)</name>\\s*<uri>\\s*([^<]*)</uri>\\s*</feed>");
Matcher feedMatch = feedPattern.matcher(xml);
while (feedMatch.find()) {
String feedName = feedMatch.group(1);
String feedURI = feedMatch.group(2);
feeds.add(new Feed(feedName, feedURI));
}
return feeds;
}
@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String addXmlFeed() throws IOException
{
int i = 0;
String stringXml = "<feed><name>SMH Top Headlines</name><uri>http://feeds.smh.com.au/rssheadlines/top.xml</uri></feed><feed><name>UTS Library News</name>";
getFeedsFromXml(stringXml);
Feed f = (Feed) feeds.get(0);
feedList.add(f);
String handler = "You have successfully added: \n";
String xmlStringReply = "" + f + "\n";
feedList.save(feedFile);
return handler + xmlStringReply;
}
一切進展順利,然后我決定實現一個for循環來處理向列表添加多個feed,我嘗試了以下(只有第二個方法的代碼):
@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String addXmlFeed() throws IOException
{
int i = 0;
String stringXml = "<feed><name>SMH Top Headlines</name><uri>http://feeds.smh.com.au/rssheadlines/top.xml</uri></feed><feed><name>UTS Library News</name>";
getFeedsFromXml(stringXml);
for (Feed feed: feeds)
{
Feed f = (Feed) feeds.get(i++);
feedList.add(f);
String handler = "You have successfully added: \n";
String xmlStringReply = "" + f + "\n";
}
feedList.save(feedFile);
return handler + xmlStringReply;
}
現在我確定這是一個基本問題,但現在在線:
return handler + xmlStringReply;
handler
和xmlStringReply
無法解析為變量,因為它們在FOR LOOP中。
這有什么簡單的方法嗎?
這兩個變量的范圍僅限於for循環。 要在循環外訪問它們,您需要通過在循環之前聲明它們來增加它們的范圍:
String handler = "";
String xmlStringReply = "";
for (Feed f: feeds) {
feedList.add(f);
handler = "You have successfully added: \n";
xmlStringReply = "" + f + "\n";
}
feedList.save(feedFile);
return handler + xmlStringReply;
此外,您當前的代碼會在每個循環中覆蓋字符串的值,而您可能想要連接這些值。 在這種情況下,您可以使用StringBuilder而不是字符串連接:
StringBuilder xmlStringReply = new StringBuilder("You have successfully added: \n");
for (Feed f: feeds) {
feedList.add(f);
xmlStringReply.append(f + "\n");
}
feedList.save(feedFile);
return xmlStringReply.toString();
因為,現在它們已經超出了范圍。
除了原始錯誤 - 您可以使用其他建議輕松解決這個問題,我建議您不要將feeds
作為實例變量。 我可以看到你的方法getFeedsFromXml()
返回列表。 所以,我認為如果在該方法中定義該變量會更好。 然后,調用方法,如,
List<Feed> feeds = getFeedsFromXml(stringXml);
或者,如果這不能提供所需的行為,那么您應該將方法重命名為loadFeedsFromXml()
。 將其作為實例變量可能會導致線程問題 。
現在,嘗試改進你的循環,
StringBuilder xmlStringReply = new StringBuilder("You have successfully added: \n");
for (Feed feed: feeds) {
feedList.add(feed);
xmlStringReply.append(f + "\n");
}
feedList.save(feedFile);
return xmlStringReply.toString();
而且,我發現你的feedList
也是一個實例變量。 這又會導致線程問題,因為它聽起來不可變或無狀態。 同步方法會給您帶來性能問題。 看看你是否可以將它作為本地方法。 一個經驗法則是盡可能縮小變量范圍 。
您需要將結果累積到變量中。 我正在使用StringBuilder
因為它使字符串連接有效。
@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String addXmlFeed() throws IOException
{
String stringXml = "<feed><name>SMH Top Headlines</name><uri>http://feeds.smh.com.au/rssheadlines/top.xml</uri></feed><feed><name>UTS Library News</name>";
getFeedsFromXml(stringXml);
StringBuilder replyBuilder = new StringBuilder("You have successfully added: \n");
for (Feed feed : feeds)
{
feedList.add(feed);
String xmlStringReply = feed + "\n";
reployBuilder.append(xmlStringReply);
}
feedList.save(feedFile);
return replyBuilder.toString();
}
您需要回答的問題是“如果添加多個Feed,我想要返回什么內容?”。
也許您想要返回"You have successfully added : feed1 feed2 feed3\\n"
在這種情況下,代碼是:
StringBuilder response = new StringBuilder( "You have successfully added: ");
for (Feed feed: feeds)
{
feedList.add(feed);
response.append(f.toString()).append(" ");
}
feedList.save(feedFile);
return response.toString();
順便說一句 ,你的feed
和f
變量是一樣的和redondant!
不要寫:
int i = 0;
for (Feed feed: feeds)
{
Feed f = (Feed) feeds.get(i++);
feedList.add(f);
}
但
for (Feed feed: feeds)
{
feedList.add(feed);
}
一個好的經驗法則是查看這樣的范圍:
{ //This is a constructor
int i;
} // This is a deconstructor
在curlies之間創建/實例化的任何東西都只存在於curlies中。 每當你使用變量和循環時:
for(int i = 0; i < 10; i++){
//some code here
} // after this curly i is no longer in scope or accessible.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.