Java迭代器示例

一些Java IteratorListIterator示例。

1.迭代器

1.1从ListSet获取Iterator ,并对其进行循环。

JavaIteratorExample1a.java
package com.mkyong;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class JavaIteratorExample1a {

    public static void main(String[] args) {

        /*
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        set.add(5);

        Iterator<Integer> iterator = set.iterator();
        */

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Iterator<Integer> iterator = list.iterator();

        while (iterator.hasNext()) {

            Integer result = iterator.next();
            System.out.println(result);

        }
    }

}

输出量

1
2
3
4
5

1.2 Java 8中,在Iterator添加了一个新的forEachRemaining ,它提供了Consumer参数来让我们定义如何使用该项目。

Iterator.java
default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }

现在,我们可以使用lambda来提供Consumer功能接口的实现。

JavaIteratorExample1b.java
package com.mkyong;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class JavaIteratorExample1b {

    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Iterator<Integer> iterator = list.iterator();

        // lambda
        // iterator.forEachRemaining(x -> System.out.println(x));

        // Java 8, method reference
        iterator.forEachRemaining(System.out::println);

    }

}

输出量

1
2
3
4
5

1.3 forEachRemaining另一个示例。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Iterator<Integer> iterator = list.iterator();

        iterator.forEachRemaining(x -> {
            System.out.println(x * 2);
        });

输出量

2
4
6
8
10

1.4使用Iterator.remove()删除元素。

JavaIteratorExample1c.java
package com.mkyong;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class JavaIteratorExample1c {

    public static void main(String[] args) {

        // immutable list
        // List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        // mutable list
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer next = iterator.next();
            if (next == 3 || next == 4) {
                iterator.remove();
            }
        }

        list.forEach(System.out::println);

    }

}

输出量

1
2
5

2. ListIterator

ListIterator扩展了Iterator以提供其他功能,例如

  • next()previous()任一方向遍历列表
  • 在迭代过程中修改列表, add()set()
  • 获取迭代器在列表中的当前位置nextIndex()previousIndex()

2.1将List转换为ListIterator

JavaIteratorExample2a.java
package com.mkyong;

import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;

public class JavaIteratorExample2a {

    public static void main(String[] args) {

        List<String> list = Arrays.asList("a", "b", "c", "d", "e");

        // get ListIterator, start from list's index 2
        ListIterator<String> iterator = list.listIterator(2);
        iterator.forEachRemaining(System.out::print);   // cde

        System.out.println("");

        // get ListIterator, start from list's index 0
        ListIterator<String> iterator2 = list.listIterator();
        iterator2.forEachRemaining(System.out::print);  // abcde
    }

}

输出量

cde
abcde

2.2沿前后方向遍历列表。

JavaIteratorExample2b.java
package com.mkyong;

import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;

public class JavaIteratorExample2b {

    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        ListIterator<Integer> iterator = list.listIterator();

        // loop to the end
        while (iterator.hasNext()) {
            Integer next = iterator.next();
            System.out.println(next);
        }

        System.out.println("---");

        // now loop back to the begin
        while (iterator.hasPrevious()) {
            Integer previous = iterator.previous();
            System.out.println(previous);
        }

    }

}

输出量

1
2
3
4
5
---
5
4
3
2
1

2.3使用ListIterator.set()更新元素

JavaIteratorExample2c.java
package com.mkyong;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class JavaIteratorExample2c {

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        ListIterator<Integer> iterator = list.listIterator();

        while (iterator.hasNext()) {
            Integer next = iterator.next();
            if (next == 3) {
                iterator.set(33);
            }
            if (next == 4) {
                iterator.set(44);
            }
        }

        list.forEach(x -> System.out.println(x));
    }

}

输出量

1
2
33  // updated, was 3
44  // updated, was 4
5

2.4使用ListIterator.add()添加元素

JavaIteratorExample2d.java
package com.mkyong;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class JavaIteratorExample2d {

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        ListIterator<Integer> iterator = list.listIterator();

        while (iterator.hasNext()) {
            Integer next = iterator.next();
            if (next == 5) {
                iterator.add(6);
            }
        }

        list.forEach(x -> System.out.println(x));
    }

}

输出量

1
2
3
4
5
6  // new!

2.4获取迭代器的当前位置, previousIndex()nextIndex()

JavaIteratorExample2c.java
package com.mkyong;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class JavaIteratorExample2c {

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        ListIterator<Integer> iterator = list.listIterator();

        while (iterator.hasNext()) {

            // cursor index, iterator not move yet!
            // init = -1 , add 0
            if (iterator.previousIndex() < 0) {
                iterator.add(0);
            }

            // move the iterator
            iterator.next();

            // if this is last index
            if (iterator.nextIndex() >= list.size()) {
                iterator.add(6);
            }

        }

        list.forEach(x -> System.out.println(x));
    }

}

输出量

0
1
2
3
4
5
6

3.将迭代器转换为流

遵循步骤Iterator -> Spliterators -> Stream -> List

JavaIteratorExample3a.java
package com.mkyong;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class JavaIteratorExample3a {

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        Iterator<Integer> iterator = list.iterator();

        // Iterator -> Spliterators -> Stream -> List
        List<Integer> result = StreamSupport.stream(
                Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
                .map(x -> x * 2)
                .collect(Collectors.toList());

        result.forEach(x -> System.out.println(x));
        System.out.println(result.getClass());

    }

}

输出量

2
4
6
8
10
class java.util.ArrayList

参考文献

翻译自: https://mkyong.com/java/java-iterator-examples/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值