java中的forEach()方法

forEach( )方法

ArrayList集合: 中重写了该方法. 内部使用的是普通for循环, 依然是不可以调用集合的方法对集合进行修改的, 只能通过元素自带的set()方法进行修改, 如果是 基本数据类型 那么就一点都不可以进行修改.

@Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount; 
        final Object[] es = elementData;
        final int size = this.size;
        for (int i = 0; modCount == expectedModCount && i < size; i++)
            action.accept(elementAt(es, i));  //  需要重写accept() 方法
        if (modCount != expectedModCount)   //  一旦修改了元素就会在这里检查不通过,报错
            throw new ConcurrentModificationException();
    }
@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

方法的使用:

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");

        //遍历
        list.forEach(s -> System.out.println(s));
    }
} 

LinkedList集合, TreeSet 集合,HashSet集合,中都有forEach() 方法. 方法都比较类似~

HashMap集合:中重写了该方法. 内部使用的是增强for进行遍历,

@Override
    public void forEach(BiConsumer<? super K, ? super V> action) {
        Node<K,V>[] tab;
        if (action == null)
            throw new NullPointerException();
        if (size > 0 && (tab = table) != null) {
            int mc = modCount;
            for (Node<K,V> e : tab) {
                for (; e != null; e = e.next)
                    action.accept(e.key, e.value);  //  这里的accept 方法, 在下面.  是一个抽象方法,需要重写,
            }
            if (modCount != mc)
                throw new ConcurrentModificationException();
        }
    }
@FunctionalInterface
public interface BiConsumer<T, U> {

    
    void accept(T t, U u);

   
    default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
        Objects.requireNonNull(after);

        return (l, r) -> {
            accept(l, r);
            after.accept(l, r);
        };
    }
}

TreeMap集合:

@Override
    public void forEach(BiConsumer<? super K, ? super V> action) {
        Objects.requireNonNull(action);
        int expectedModCount = modCount;
        for (Entry<K, V> e = getFirstEntry(); e != null; e = successor(e)) {
            action.accept(e.key, e.value);//    需要重写了该方法

            if (expectedModCount != modCount) {
                throw new ConcurrentModificationException();
            }
        }
    }
@FunctionalInterface
public interface BiConsumer<T, U> {

    void accept(T t, U u);//  抽象方法
    
    default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
        Objects.requireNonNull(after);

        return (l, r) -> {
            accept(l, r);
            after.accept(l, r);
        };
    }
}
数组:

数组里面没有对应的方法. 直接调会出错.

public class Test {
    public static void main(String[] args) {
        int[] arr={1,2,5,7,8};
//        arr.forEach()  // 无法调出来该方法,直接打出来会报红. 

        String[] srr={"fjdsjf","fhudaf"};
//        srr.forEach();

    }
}

欢迎大家评论点赞,讨论~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CQXXCL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值