Java?mapToInt()方法使用小結(jié)
一、用途
在 Java 8 引入 Stream API 之后,集合處理變得更函數(shù)式、更簡(jiǎn)潔。
在處理對(duì)象集合時(shí)經(jīng)常需要把對(duì)象中的某個(gè)字段(年齡、數(shù)量、價(jià)格等)提取成整型流(IntStream),以便:
- 快速求和(
sum()) - 求平均值(
average()) - 求最大值/最小值(
max()/min()) - 轉(zhuǎn)換為基本類型數(shù)組(
toArray())
要完成這些操作,最常用的方法之一就是 —— mapToInt()。
二、什么是mapToInt()?
mapToInt() 是 Stream 接口中的一個(gè)終極武器,它可以將 Stream 轉(zhuǎn)換為 IntStream。
方法簽名如下:
IntStream mapToInt(ToIntFunction<? super T> mapper);
功能總結(jié):
將對(duì)象流中的元素映射為 int 類型,返回 IntStream。
三、mapToInt()有什么用?
1. 將對(duì)象集合轉(zhuǎn)換為整型流
例如:把 List<Person> 中的年齡轉(zhuǎn)換為 IntStream。
2. 使用 IntStream 的快速計(jì)算
例如:
.sum().average().max().min().toArray()
這些是普通 Stream 沒有的強(qiáng)大方法。
3. 避免自動(dòng)裝箱 / 拆箱,提高性能
IntStream 是基礎(chǔ)類型流,不涉及 Integer 的裝箱操作,性能更高。
四、基本用法示例
示例:提取對(duì)象字段為整型流
class Person {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
}
public class Demo {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("Tom", 18),
new Person("Jerry", 20),
new Person("Alice", 22)
);
IntStream ages = people.stream()
.mapToInt(Person::getAge);
ages.forEach(System.out::println);
}
}
輸出:
18
20
22
五、典型應(yīng)用場(chǎng)景
1. 求和:sum()
int totalAge = people.stream()
.mapToInt(Person::getAge)
.sum();
System.out.println(totalAge); // 60
2. 求平均值:average()
double avgAge = people.stream()
.mapToInt(Person::getAge)
.average()
.orElse(0);
System.out.println(avgAge); // 20.0
3. 求最大值 / 最小值
int maxAge = people.stream()
.mapToInt(Person::getAge)
.max()
.orElse(-1);
int minAge = people.stream()
.mapToInt(Person::getAge)
.min()
.orElse(-1);
System.out.println(maxAge); // 22
System.out.println(minAge); // 18
4. 轉(zhuǎn)為int[]
int[] arr = people.stream()
.mapToInt(Person::getAge)
.toArray();
System.out.println(Arrays.toString(arr));
// 輸出: [18, 20, 22]
六、使用 Lambda 表達(dá)式
除了方法引用,也可以使用 Lambda:
int total = people.stream()
.mapToInt(p -> p.getAge())
.sum();
但一般用方法引用更方便,這是 Java 8 引入的方法引用(Method Reference),它是一種簡(jiǎn)化 Lambda 表達(dá)式的語法形式。
七、與map()的區(qū)別
| 方法 | 返回類型 | 用途 |
|---|---|---|
| map() | Stream<R> | 返回對(duì)象流 |
| mapToInt() | IntStream | 返回整型流,適合數(shù)學(xué)計(jì)算 |
示例:
Stream<Integer> stream1 = people.stream()
.map(Person::getAge); // 裝箱 Integer,不適合大量計(jì)算
IntStream stream2 = people.stream()
.mapToInt(Person::getAge); // 基本類型 int 流,高性能
八、實(shí)戰(zhàn)案例:計(jì)算商品總價(jià)格
class Item {
private String name;
private int price;
Item(String name, int price) {
this.name = name;
this.price = price;
}
public int getPrice() {
return price;
}
}
public class Demo {
public static void main(String[] args) {
List<Item> items = List.of(
new Item("Book", 30),
new Item("Pen", 5),
new Item("Bag", 60)
);
int totalPrice = items.stream()
.mapToInt(Item::getPrice)
.sum();
System.out.println("總價(jià)格:" + totalPrice);
}
}
輸出:
總價(jià)格:95
到此這篇關(guān)于Java mapToInt()方法詳解的文章就介紹到這了,更多相關(guān)Java mapToInt()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis批量插入數(shù)據(jù)的三種方法實(shí)例
由于項(xiàng)目需要生成多條數(shù)據(jù),并保存到數(shù)據(jù)庫當(dāng)中,項(xiàng)目使用了Spring+MyBatis,所以打算使用MyBatis批量插入,應(yīng)該要比循環(huán)插入的效果更好,下面這篇文章主要給大家介紹了關(guān)于MyBatis批量插入數(shù)據(jù)的三種方法,需要的朋友可以參考下2021-10-10
ArrayList及HashMap的擴(kuò)容規(guī)則講解
今天小編就為大家分享一篇關(guān)于ArrayList及HashMap的擴(kuò)容規(guī)則講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
spring boot-2.1.16整合swagger-2.9.2 含yml配置文件的代碼詳解
這篇文章主要介紹了spring boot-2.1.16整合swagger-2.9.2 含yml配置文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)
在使用java的集合類遍歷數(shù)據(jù)的時(shí)候,在某些情況下可能需要對(duì)某些數(shù)據(jù)進(jìn)行刪除,下面這篇文章主要給大家介紹了關(guān)于java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié),需要的朋友可以參考下2023-10-10
Java Swing實(shí)現(xiàn)讓窗體居中顯示的方法示例
這篇文章主要介紹了Java Swing實(shí)現(xiàn)讓窗體居中顯示的方法,結(jié)合實(shí)例形式分析了swing使用setBounds方法控制窗口布局的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
使用Java DOM解析器修改XML文件內(nèi)容的操作方法
在Java中,XML文件的解析和修改可以通過多種方法實(shí)現(xiàn),其中DOM(Document Object Model)是一種常用的方式,在本文中,我們將介紹如何使用Java DOM解析器修改XML文件中的內(nèi)容,并給出一個(gè)具體的示例,需要的朋友可以參考下2024-08-08
Springboot重寫addInterceptors()方法配置攔截器實(shí)例
這篇文章主要介紹了Springboot重寫addInterceptors()方法配置攔截器實(shí)例,spring?boot拋棄了復(fù)雜的xml配置,我們可以自定義配置類(標(biāo)注@Configuration注解的類)來實(shí)現(xiàn)WebMvcConfigurer接口,并重寫addInterceptors()方法來配置攔截器,需要的朋友可以參考下2023-09-09

