成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

簡單易用,還不會使用Stream流的map()方法嗎

開發(fā) 前端
Java8 的 Stream 流 map() 方法是將流中的元素轉(zhuǎn)換為另外一個(gè)流中的元素,轉(zhuǎn)換前后兩個(gè)流的元素個(gè)數(shù)不發(fā)生改變。

哈嘍,大家好,我是指北君。

Stream API 是Java8中新加入的功能,現(xiàn)在都 Java20 了,不會還有人沒用過吧?

今天給大家演示一下 Stream API 中的 map() 方法。

前言

在日常的開發(fā)工作中經(jīng)常碰到要處理 List 中數(shù)據(jù)的問題,比如從一個(gè)對象集合中獲得對象中的一個(gè)屬性的集合。之前我們想到的是遍歷每個(gè)元素,然后取出來放到另外一個(gè)集合中,比較繁瑣;在 Java8 之后,對集合可以進(jìn)行 Stream 操作,使上面的處理更簡潔。

概述

Stream 流式處理中有 map() 方法,先看下其定義,該方法在java.util.stream.Stream類中

圖片

可以看到 map() 方法接收一個(gè)函數(shù)式接口參數(shù),入?yún)⒂幸粋€(gè) T ,返回一個(gè) Stream 流,這個(gè)流是 R 泛型。主要有以下幾點(diǎn)注意,

  • 入?yún)⑹且粋€(gè)流中的元素;
  • 出參是一個(gè)流,且流中是新元素;

用圖表示就是下面的樣子,原始流中有四個(gè)圓形圖案,調(diào)用 map() 函數(shù)后變成了四個(gè)五角星圖案,這里的圓形圖案和五角星圖案是一一對應(yīng)的,也就是原始流中有多少個(gè)元素,調(diào)用 map() 方法后依舊有多少個(gè)元素,唯一改變的是流中的元素類型。

圖片

示例

我們先創(chuàng)建一個(gè)實(shí)體類 Student.java

@Data
public class Student implements Serializable {
/**
* 姓名
*/
private String name;
/**
* 班級
*/
private String schoolClass;
/**
*語文成績
*/
private Integer chineseScore;
/**
* 數(shù)學(xué)成績
*/
private Integer mathScore;
}

再創(chuàng)建一個(gè)初始化數(shù)據(jù)的類:

public class DataFactory {
public static List<Student> initData(){
List<Student> list= new ArrayList<>();
Student s1=new Student();
s1.setName("湯霖");
s1.setSchoolClass("小一班");
s1.setChineseScore(87);
s1.setMathScore(95);
list.add(s1);

Student s2=new Student();
s2.setName("李牧唐");
s2.setSchoolClass("小二班");
s2.setChineseScore(98);
s2.setMathScore(97);
list.add(s2);

Student s3=new Student();
s3.setName("顧北辰");
s3.setSchoolClass("二年級");
s3.setChineseScore(89);
s3.setMathScore(94);
list.add(s3);

Student s4=new Student();
s4.setName("言言");
s4.setSchoolClass("小二班");
s4.setChineseScore(100);
s4.setMathScore(90);
list.add(s4);

Student s5=new Student();
s5.setName("大運(yùn)");
s5.setSchoolClass("小三班");
s5.setChineseScore(96);
s5.setMathScore(100);
list.add(s5);
return list;
}
}

找出所有的學(xué)生姓名

public static void main(String[] args) {
DataFactory.initData().stream()
.map(student -> student.getName())
.forEach(System.out::println);
}

這里使用了 map() 方法,入?yún)⑹?Student,出參是以 String 為泛型的流,最后使用 forEach 進(jìn)行了打印,看下結(jié)果

圖片

可以看到剛好把所有的學(xué)生姓名均打印出來了。如果想把這些學(xué)生姓名放到一個(gè)List中怎么辦?

將學(xué)生姓名放到list中

public static void main(String[] args) {
//將所有的學(xué)生姓名放到list中
List<String> studentNames = DataFactory.initData().stream()
.map(student -> student.getName())
.collect(Collectors.toList());
for (String studentName : studentNames) {
System.out.println(studentName);
}
}

同樣的找出所有的班級,找出所有學(xué)生的成績都可類比上面的,可以看到打印出的學(xué)生姓名或班級是有重復(fù)數(shù)據(jù),這個(gè)要怎么解決。我們知道在最后是把數(shù)據(jù)放到 List 中,為了解決重復(fù)的問題可以把數(shù)據(jù)放到 Set 中,利用 Set 的去重功能:

//將學(xué)生姓名放到Set中,可以實(shí)現(xiàn)去重功能
Set<String> studentNames = DataFactory.initData().stream()
.map(student -> student.getName())
.collect(Collectors.toSet());

結(jié)果不再打印,有興趣的可以自己試試。

將姓名為“湯霖”的語文成績置為90

現(xiàn)在有這樣一個(gè)需求,要把姓名為湯霖學(xué)生的語文成績置為90,看下利用 map() 函數(shù)怎么做?

public static void main(String[] args) {
List<Student> students = DataFactory.initData();

List<Student> studentNames = students.stream().map(student -> {
if ("湯霖".equals(student.getName())) {
student.setChineseScore(90);
}
return student;
}).collect(Collectors.toList());

for (Student studentName : studentNames) {
System.out.println(studentName);
}
//打印老的list
System.out.println("-----改之前的數(shù)據(jù)-----");
for (Student studentName : students) {
System.out.println(studentName);
}
}

輸出結(jié)果:

圖片

從上面的結(jié)果中可以看出,湯霖的語文成績的確被改為了90?,這點(diǎn)是沒錯(cuò)的。再看原數(shù)據(jù)也被改為了90,上面提到過 map() 方法生成的是一個(gè)新流,原始流中的數(shù)據(jù)也被修改了,因?yàn)橄旅孢@行代碼是在原始流中元素的基礎(chǔ)上修改的引用類型中的數(shù)據(jù),導(dǎo)致的原始流中的數(shù)據(jù)也會改。

總結(jié)

Java8 的 Stream 流 map() 方法是將流中的元素轉(zhuǎn)換為另外一個(gè)流中的元素,轉(zhuǎn)換前后兩個(gè)流的元素個(gè)數(shù)不發(fā)生改變。

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2023-07-03 08:01:38

AI模型AIGC

2020-07-21 08:08:40

Nginx跨域Web項(xiàng)目

2021-05-12 07:50:05

Linux運(yùn)維Linux系統(tǒng)

2024-11-19 08:35:49

前端開發(fā)數(shù)組

2011-05-18 09:21:55

英特爾ARM

2024-11-05 10:24:50

2020-08-13 09:37:20

Python代碼命令

2022-09-13 12:10:04

unlink刪除文件

2016-09-18 18:27:21

KubernetesDocker

2022-08-01 08:17:46

mysqlwindows系統(tǒng)

2015-11-10 18:04:22

FileMaker

2023-08-27 21:47:15

2017-05-23 14:59:54

交換機(jī)接口寬帶

2021-03-16 15:12:57

CompletableFuture機(jī)制java

2022-05-14 23:49:32

Python數(shù)據(jù)計(jì)算技巧

2019-07-18 12:24:20

開發(fā)者技能工具

2022-06-12 16:05:22

vimLinux

2023-05-12 07:40:01

Java8API工具

2019-11-18 14:45:13

代碼開發(fā)工具

2022-09-09 14:56:18

Linuxcpu
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人天堂噜噜噜 | 国产精品久久久久久久久久久久久久 | 青青草中文字幕 | 麻豆久久精品 | 91精品国产色综合久久不卡蜜臀 | 欧美日韩成人在线观看 | 亚洲乱码国产乱码精品精98午夜 | 一区二区免费在线 | 日韩中文字幕一区二区 | 国产精品成人69xxx免费视频 | 欧美中文字幕在线观看 | 日本黄色大片免费 | av男人的天堂av | 久久亚洲国产精品 | 成人精品在线视频 | 美女天堂 | 涩涩视频在线看 | 国产精品久久免费观看 | 97高清国语自产拍 | 玖玖玖在线观看 | 亚洲激情综合 | 国产一区二区在线免费观看 | 91麻豆精品国产91久久久久久久久 | 亚洲精品成人网 | 久久亚洲精品久久国产一区二区 | 久久精品亚洲一区 | 99久热在线精品视频观看 | 精品国产成人 | 亚洲精品欧美精品 | 日本一二三区在线观看 | 久久一级免费视频 | 一区精品国产欧美在线 | 亚洲第一成人影院 | 在线视频一区二区三区 | 午夜视频一区 | 久久人| 福利av在线 | 一区二区av | 午夜视频在线观看网址 | 国产精品免费小视频 | 美女黄色在线观看 |