第二个条件替代for循环

时间:2013-11-26 17:59:13

标签: java for-loop conditional-statements

是否可以向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)

2 个答案:

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