日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

对 Stream 中 Map 与 ForEach 做个简单说明

發(fā)布時(shí)間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对 Stream 中 Map 与 ForEach 做个简单说明 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

經(jīng)常會(huì)有童鞋把 Map 和 Foreach 用錯(cuò),可能會(huì)出現(xiàn)如下用法:

List<Student> studentChangeList = studentList.stream().forEach(student -> student.setAge(99));

有些編譯器會(huì)直接報(bào)錯(cuò),比如 IDEA。因?yàn)?ForEach 是沒(méi)有返回值的,ForEach 處理過(guò)的 Stream 是無(wú)法再賦值給 studentChangeList 。

但是現(xiàn)在就是需要對(duì)集合進(jìn)行處理,并獲取處理過(guò)的集合數(shù)據(jù),這時(shí)候可以這樣做

studentList.stream().forEach(student -> student.setAge(99));

studentList 中的數(shù)據(jù)就是已經(jīng)處理過(guò)的數(shù)據(jù)。

下面就 Map 和 ForEach 做一些簡(jiǎn)單的說(shuō)明,大體上就能對(duì)這兩個(gè)方法有所理解

一、 結(jié)論

Map:返回的是一個(gè)新流,可以對(duì)這個(gè)流進(jìn)一步操作

ForEach:返回void,即無(wú)返回值

二、源碼

1. Map 源碼說(shuō)明

/*** Returns a stream consisting of the results of applying the given* function to the elements of this stream.** <p>This is an <a href="package-summary.html#StreamOps">intermediate* operation</a>.** @param <R> The element type of the new stream* @param mapper a <a href="package-summary.html#NonInterference">non-interfering</a>,* <a href="package-summary.html#Statelessness">stateless</a>* function to apply to each element* @return the new stream*/<R> Stream<R> map(Function<? super T, ? extends R> mapper);

2. ForEach 源碼說(shuō)明

/*** Performs an action for each element of this stream.** <p>This is a <a href="package-summary.html#StreamOps">terminal* operation</a>.** <p>The behavior of this operation is explicitly nondeterministic.* For parallel stream pipelines, this operation does <em>not</em>* guarantee to respect the encounter order of the stream, as doing so* would sacrifice the benefit of parallelism. For any given element, the* action may be performed at whatever time and in whatever thread the* library chooses. If the action accesses shared state, it is* responsible for providing the required synchronization.** @param action a <a href="package-summary.html#NonInterference">* non-interfering</a> action to perform on the elements*/void forEach(Consumer<? super T> action);

三、應(yīng)用

1.Map 是1對(duì)1的映射

示例:
將兩位同學(xué)的年齡都加上100

public static void main(String[] args) {List<Student> studentList = new ArrayList<>();Student student1 = new Student();student1.setStudentId(1);student1.setStudentName("李毅");student1.setAge(17);Student student2 = new Student();student2.setStudentId(2);student2.setStudentName("張三豐");student2.setAge(18);studentList.add(student1);studentList.add(student2);List<Integer> ageList = studentList.stream().map(student -> student.getAge() + 100).collect(Collectors.toList());ageList.stream().forEach(System.out::println);}

運(yùn)行結(jié)果:

117 118

2.ForEach 是對(duì) Stream 中每一個(gè)元素進(jìn)行處理。

雖然 ForEach 處理 Stream 中元素的時(shí)候沒(méi)有返回值,但是 ForEach 對(duì) Stream 中元素已經(jīng)產(chǎn)生影響,即 ForEach 對(duì) Stream 中元素的操作已經(jīng)被保存下來(lái)。

示例:
將兩位同學(xué)的年齡改為99,名字改為英俊

public static void main(String[] args) {List<Student> studentList = new ArrayList<>();Student student1 = new Student();student1.setStudentId(1);student1.setStudentName("李毅");student1.setAge(17);Student student2 = new Student();student2.setStudentId(2);student2.setStudentName("張三豐");student2.setAge(18);studentList.add(student1);studentList.add(student2);studentList.stream().forEach(student -> {student.setAge(99);student.setStudentName("英俊");});studentList.stream().forEach(System.out::println);}

運(yùn)行結(jié)果:

Student(studentId=1, studentName=英俊, age=99) Student(studentId=2, studentName=英俊, age=99)

總結(jié)

以上是生活随笔為你收集整理的对 Stream 中 Map 与 ForEach 做个简单说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。