Ways to iterate over a list in Java

后端 未结 12 1754
孤独总比滥情好
孤独总比滥情好 2020-11-22 00:46

Being somewhat new to the Java language I\'m trying to familiarize myself with all the ways (or at least the non-pathological ones) that one might iterate through a list (or

相关标签:
12条回答
  • 2020-11-22 01:08

    Example of each kind listed in the question:

    ListIterationExample.java

    import java.util.*;
    
    public class ListIterationExample {
    
         public static void main(String []args){
            List<Integer> numbers = new ArrayList<Integer>();
    
            // populates list with initial values
            for (Integer i : Arrays.asList(0,1,2,3,4,5,6,7))
                numbers.add(i);
            printList(numbers);         // 0,1,2,3,4,5,6,7
    
            // replaces each element with twice its value
            for (int index=0; index < numbers.size(); index++) {
                numbers.set(index, numbers.get(index)*2); 
            }
            printList(numbers);         // 0,2,4,6,8,10,12,14
    
            // does nothing because list is not being changed
            for (Integer number : numbers) {
                number++; // number = new Integer(number+1);
            }
            printList(numbers);         // 0,2,4,6,8,10,12,14  
    
            // same as above -- just different syntax
            for (Iterator<Integer> iter = numbers.iterator(); iter.hasNext(); ) {
                Integer number = iter.next();
                number++;
            }
            printList(numbers);         // 0,2,4,6,8,10,12,14
    
            // ListIterator<?> provides an "add" method to insert elements
            // between the current element and the cursor
            for (ListIterator<Integer> iter = numbers.listIterator(); iter.hasNext(); ) {
                Integer number = iter.next();
                iter.add(number+1);     // insert a number right before this
            }
            printList(numbers);         // 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
    
            // Iterator<?> provides a "remove" method to delete elements
            // between the current element and the cursor
            for (Iterator<Integer> iter = numbers.iterator(); iter.hasNext(); ) {
                Integer number = iter.next();
                if (number % 2 == 0)    // if number is even 
                    iter.remove();      // remove it from the collection
            }
            printList(numbers);         // 1,3,5,7,9,11,13,15
    
            // ListIterator<?> provides a "set" method to replace elements
            for (ListIterator<Integer> iter = numbers.listIterator(); iter.hasNext(); ) {
                Integer number = iter.next();
                iter.set(number/2);     // divide each element by 2
            }
            printList(numbers);         // 0,1,2,3,4,5,6,7
         }
    
         public static void printList(List<Integer> numbers) {
            StringBuilder sb = new StringBuilder();
            for (Integer number : numbers) {
                sb.append(number);
                sb.append(",");
            }
            sb.deleteCharAt(sb.length()-1); // remove trailing comma
            System.out.println(sb.toString());
         }
    }
    
    0 讨论(0)
  • 2020-11-22 01:13

    In java 8 you can use List.forEach() method with lambda expression to iterate over a list.

    import java.util.ArrayList;
    import java.util.List;
    
    public class TestA {
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("Apple");
            list.add("Orange");
            list.add("Banana");
            list.forEach(
                    (name) -> {
                        System.out.println(name);
                    }
            );
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:14

    In Java 8 we have multiple ways to iterate over collection classes.

    Using Iterable forEach

    The collections that implement Iterable (for example all lists) now have forEach method. We can use method-reference introduced in Java 8.

    Arrays.asList(1,2,3,4).forEach(System.out::println);
    

    Using Streams forEach and forEachOrdered

    We can also iterate over a list using Stream as:

    Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
    Arrays.asList(1,2,3,4).stream().forEachOrdered(System.out::println);
    

    We should prefer forEachOrdered over forEach because the behaviour of forEach is explicitly nondeterministic where as the forEachOrdered performs an action for each element of this stream, in the encounter order of the stream if the stream has a defined encounter order. So forEach does not guarantee that the order would be kept.

    The advantage with streams is that we can also make use of parallel streams wherever appropriate. If the objective is only to print the items irrespective of the order then we can use parallel stream as:

    Arrays.asList(1,2,3,4).parallelStream().forEach(System.out::println);
    
    0 讨论(0)
  • 2020-11-22 01:14

    You could always switch out the first and third examples with a while loop and a little more code. This gives you the advantage of being able to use the do-while:

    int i = 0;
    do{
     E element = list.get(i);
     i++;
    }
    while (i < list.size());
    

    Of course, this kind of thing might cause a NullPointerException if the list.size() returns 0, becuase it always gets executed at least once. This can be fixed by testing if element is null before using its attributes / methods tho. Still, it's a lot simpler and easier to use the for loop

    0 讨论(0)
  • 2020-11-22 01:16

    I don't know what you consider pathological, but let me provide some alternatives you could have not seen before:

    List<E> sl= list ;
    while( ! sl.empty() ) {
        E element= sl.get(0) ;
        .....
        sl= sl.subList(1,sl.size());
    }
    

    Or its recursive version:

    void visit(List<E> list) {
        if( list.isEmpty() ) return;
        E element= list.get(0) ;
        ....
        visit(list.subList(1,list.size()));
    }
    

    Also, a recursive version of the classical for(int i=0... :

    void visit(List<E> list,int pos) {
        if( pos >= list.size() ) return;
        E element= list.get(pos) ;
        ....
        visit(list,pos+1);
    }
    

    I mention them because you are "somewhat new to Java" and this could be interesting.

    0 讨论(0)
  • 2020-11-22 01:16

    Right, many alternatives are listed. The easiest and cleanest would be just using the enhanced for statement as below. The Expression is of some type that is iterable.

    for ( FormalParameter : Expression ) Statement
    

    For example, to iterate through, List<String> ids, we can simply so,

    for (String str : ids) {
        // Do something
    }
    
    0 讨论(0)
提交回复
热议问题