是否可以向Java的alternative for loop representation添加第二个条件。
我有一个在do-while
循环结束时更新的集合。在此do-while loop
中,有一个for loop
。
例如:(这不起作用,但说明了我想要实现的目标)
List<String> list =....load up with stuff
do {
for (String string : list && counter < 5)
{
System.out.println(string);
counter++;
}
while(update list)
以某种方式正常表示:
do {
for (int i = 0; i < list.size() && counter < 5; i++)
{
System.out.println(list.get(i));
counter++;
}
while(update list)
在这种结构中不起作用。
我用这段代码尝试了两个答案:
int counter = 0;
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
System.out.println("Test one");
for (String string : list) {
if(counter < 3 )
System.out.println(string);
else
break;
counter++;
}
System.out.println("Test two");
counter = 0;
for (String string : list) {
if (counter >= 3) break;
System.out.println(string);
counter++;
}
TedHopp的答案解决了第一个循环的问题。
在for loop
之外突破while loop
和,我最终执行了以下操作:
int breakNow = false;
do {
for (String string : list)
{
System.out.println(string);
counter++;
if (counter >= 3)
{
breakNow = true;
break;
}
}
while(update list && !breakNow)
答案 0 :(得分:4)
您不能将二进制测试与增强的for
循环合并;语法不允许这样做。您需要使用传统的for
循环语法,否则将布尔测试放在循环中并将break
放在其中。
for (String string : list) {
if (counter >= 5) break;
System.out.println(string);
counter++;
}
我不确定哪种方法不适用于适用于增强型for
循环的传统语法;他们基本上做同样的事情。 (事实上,由于增强的for
循环使用迭代器,因此如果要异步更新列表,则存在并发修改异常的风险。)
答案 1 :(得分:1)
不是默认情况下,但你可以像这样创建一些很酷的东西:
public class ForEachCondition
{
public static void main(String[] args)
{
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(3);
ints.add(100);
ints.add(200);
for (Integer i : new ConditionalIterator<Integer>(ints, new ConditionalIterator.Condition<Integer>()
{
@Override
public boolean next(Integer t)
{
return t < 130;
}
}))
{
System.out.println(i);
}
}
}
class ConditionalIterator<T> implements Iterable<T>, Iterator<T>
{
private Condition<T> condition;
private Iterator<T> iterator;
private T next;
public ConditionalIterator(Iterable<T> it, Condition<T> cond)
{
this.iterator = it.iterator();
this.condition = cond;
}
@Override
public Iterator<T> iterator()
{
return this;
}
@Override
public boolean hasNext()
{
if (iterator.hasNext())
{
next = iterator.next();
return condition.next(next);
}
return false;
}
@Override
public T next()
{
return next;
}
@Override
public void remove()
{
iterator.remove();
}
public static interface Condition<T>
{
public boolean next(T t);
}
}
使用新的Java 8,for可能如下所示:
for (Integer i : new ConditionalIterator<Integer>(ints, (Integer t) -> t < 130)
{
System.out.println(i);
}