JDK源码阅读——java.lang.Iterable

本文介绍了Java中Iterable接口的基本概念,包括其源码解析及具体应用场景。通过一个简单的例子展示了如何实现Iterable接口并使用for-each循环进行遍历。

接口

Iterable

1. 概述

实现这个接口允许对象成为“for-each循环”语句的目标。

2.源码阅读

public interface Iterable<T> {
    /**
     *返回类型{@code T}元素的迭代器.
     *
     * @return  Iterator.
     */
    Iterator<T> iterator();

    /**
     * 对Iterable的每个元素执行给定的操作,直到所有元素都被处理或操作抛出异常
     *
     * @param action 为每个元素执行的操作 例如:(s)-> System.out.println(s)
     * 
     * @throws NullPointerException 如果指定的操作为空
     * @since 1.8
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    /**
     * 在这个Iterable描述的元素之上创建一个Spliterator。
     * @return 一个Spliterator对这个元素所描述的元素。
     * @since 1.8
     */
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }

3.Iterable运用

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class SubIterable implements Iterable<String> {
    private List<String> strings = new ArrayList<String>();

    public void add(String string){
        strings.add(string);
    }

    @Override
    public Iterator<String> iterator() {
        return strings.iterator();
    }

}


public class IterableTest {
    @Test
    public void test(){
        SubIterable subIterable = new SubIterable();
        subIterable.add("加进去");
        subIterable.add("再加进去1");
        subIterable.add("再加进去2");
        subIterable.add("再加进去3");
        System.out.println("for - each:");
        for (String s:subIterable
             ) {
            System.out.println(s);
        }
        System.out.println("forEach:");
        subIterable.forEach((s) -> System.out.println(s));
    }
}

输出结果 :
for - each:
加进去
再加进去1
再加进去2
再加进去3
forEach:
加进去
再加进去1
再加进去2
再加进去3

实现Iterable就可以用for-each语句

D:\Java\jdk-21.0.2\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:15214,suspend=y,server=n "-javaagent:C:\Users\c30080007\AppData\Local\JetBrains\IntelliJIdea2025.1\captureAgent\debugger-agent.jar=file:///C:/Users/C30080~1/AppData/Local/Temp/capture7514175130466777029.props" -javaagent:D:\appfile\yalustudio\agent\gaia-studio-agent-1.0.0-SNAPSHOT.jar -Dfoundation.console.group=c30080007 -Dfoundation.console.appName=apigcESAggregation -Dfoundation.console.enabled=true -Dfoundation.console.url=http://hissit.huawei.com/gaia/console/admin -Dfoundation.console.discovery.enabled=true -Djalor.web.requestSecurity-filter.enabled=false -DyaluStudioConvertRealRequestApiUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/application/query-actual-route -DyaluStudioQueryEurekaGroupUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/application/query-eureka-group -DyaluStudioAddRecordingRulesUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/record/playback/add-result -DyaluStudioAddDeployUnitRunInfoUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/application/deploy-unit-run-info -DyaluStudioGetPublicDeployUnitInstancesUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/application/public-deploy-unit-instances -DyaluStudioAddEurekaGroupUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/application/eureka-group -DyaluStudioIsLocalIpAddressUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/plugin/judgment/ip/address -DlocalDebugUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/plugin/local-deploy -DconfigInfoUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/config/link -DgetClustersActiveProfileUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/ads/clusters-params -DyaluStudioDataReporterUrl=https://gaia-studio.dp-beta.huawei.com/gaia-studio/gateway/services/v1/operation-record/add-record -Ddebug.deployId=866dc1709aa83872a9ceb585d698d370 -DappId=com.huawei.cbgit.gaia.apigc -DappName=apigcESAggregation -DenvJsonFilePath=C:\Users\c30080007\AppData\Roaming\JetBrains\IntelliJIdea2025.1\scratches\http-client.env.json -DwriteEnvFileSuccessLog=yaluStudioWriteEnvSuccess -Dauthor=c30080007 -Dgroup=c30080007 -DparentGroup=kwe_dev -DoperationId=c978d871-b981-42a7-a588-d03b32ad390a -DmicroserviceId=null -DrepoUrl=https://codehub-dg-g.huawei.com/CBGIT_Public/GaiaDesignDevCenter/GApiGCES.git -DpluginActiveEnv=uat -DuseLocalConfig=false -agentpath:C:\Users\c30080007\AppData\Local\Temp\idea_libasyncProfiler_dll_temp_folder33236\libasyncProfiler.dll=version,jfr,event=wall,interval=10ms,cstack=no,file=C:\Users\c30080007\IdeaSnapshots\MainApplication_2025_11_25_152607.jfr,dbghelppath=C:\Users\c30080007\AppData\Local\Temp\idea_dbghelp_dll_temp_folder7\dbghelp.dll,log=C:\Users\c30080007\AppData\Local\Temp\MainApplication_2025_11_25_152607.jfr.log.txt,logLevel=DEBUG -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\c30080007\AppData\Local\Temp\classpath368542657.jar com.huawei.it.gaia.apigc.app.MainApplication 已连接到地址为 ''127.0.0.1:15214',传输: '套接字'' 的目标虚拟机 11-25 15:26:08.321 INFO YaluStudioAgent : yaluStudioIsCloudDeploy=null 11-25 15:26:08.327 INFO AgentStarter : agent file dir is [D:\appfile\yalustudio\agent] 11-25 15:26:08.329 INFO AgentStarter : agent param: {} 11-25 15:26:08.330 INFO ConfigUtils : useLocalConfig is [false] OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 11-25 15:26:08.912 INFO StudioServerClient : Config Info DTO request success, config link http://appconfig-beta.huawei.com/ConfigCenter/services/saasConfigcenterGetConfig?application_id=com.huawei.cbgit.gaia.apigc&sub_application_id=apigcESAggregation&region=kwe&environment=kwe_dev&version=1.0 11-25 15:26:09.027 INFO KmsClient : start decrypt 11-25 15:26:09.152 INFO KmsClient : end decrypt 11-25 15:26:09.152 INFO ConfigUtils : useLocalConfig is [false] 11-25 15:26:09.153 INFO StudioServerClient : get cluster param: com.yalu.studio.huawei.it.yalu.client.req.ClustersParamsReq@30ed9c6c 11-25 15:26:10.863 INFO ConfigUtils : useLocalConfig is [false] Exception in thread "main" java.lang.ExceptionInInitializerError at com.huawei.foundation.commons.logback.sensitive.SensitiveDataConvertor.convert(SensitiveDataConvertor.java:29) at com.huawei.foundation.commons.logback.sensitive.SensitiveDataConvertor.convert(SensitiveDataConvertor.java:23) at ch.qos.logback.core.pattern.FormattingConverter.write(FormattingConverter.java:36) at ch.qos.logback.core.pattern.PatternLayoutBase.writeLoopOnConverters(PatternLayoutBase.java:174) at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:200) at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:41) at ch.qos.logback.core.encoder.LayoutWrappingEncoder.encode(LayoutWrappingEncoder.java:114) at ch.qos.logback.core.OutputStreamAppender.writeOut(OutputStreamAppender.java:203) at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:257) at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:111) at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:85) at com.huawei.foundation.commons.logging.LogbackLoggingManager.logLine(LogbackLoggingManager.java:129) at com.huawei.foundation.commons.logging.LogbackLoggingManager.logLine(LogbackLoggingManager.java:113) at com.huawei.foundation.commons.logging.Log.logln(Log.java:260) at com.huawei.foundation.commons.startup.ServiceApplicationStartingListener.onApplicationEvent(ServiceApplicationStartingListener.java:38) at com.huawei.foundation.commons.startup.ServiceApplicationStartingListener.onApplicationEvent(ServiceApplicationStartingListener.java:27) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:185) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:178) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:156) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138) at org.springframework.boot.context.event.EventPublishingRunListener.multicastInitialEvent(EventPublishingRunListener.java:136) at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:75) at org.springframework.boot.SpringApplicationRunListeners.lambda$starting$0(SpringApplicationRunListeners.java:54) at java.base/java.lang.Iterable.forEach(Iterable.java:75) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:54) at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1362) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1351) at com.huawei.it.gaia.apigc.app.MainApplication.main(MainApplication.java:31) Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private java.lang.Throwable java.lang.Throwable.cause accessible: module java.base does not "opens java.lang" to unnamed module @1356d4d4 at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:367) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:315) at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:183) at java.base/java.lang.reflect.Field.setAccessible(Field.java:177) at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:803) at com.huawei.foundation.commons.logging.security.SensitiveExceptionFilter.<clinit>(SensitiveExceptionFilter.java:42) ... 30 more
最新发布
11-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值