[英]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.