Stream流的使用
場(chǎng)景及代碼案例源于實(shí)際項(xiàng)目
1. 需求描述
現(xiàn)存一list集合,其中保存了投資人的信息。
Person (name, age, money rateOfReturn)
其中的money表示投資人現(xiàn)有資產(chǎn),rateOfReturn表示投資年回報(bào)率
需求:
1.計(jì)算投資人年齡之和;
2.根據(jù)現(xiàn)有資產(chǎn)及投資回報(bào)率,計(jì)算所有投資人一年后的資產(chǎn)總和;
2. 代碼
實(shí)體類
package com.drc.java8.stream.practice.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author dairuichuang
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private Integer age;
private BigDecimal money;
private BigDecimal rateOfReturn;
}
主程序
package com.drc.java8.stream.practice;
import com.drc.java8.stream.practice.domain.Person2;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class ListPersonPractice {
// 投資人集合
List<Person> PersonList = new ArrayList<>();
// 初始化投資人
{
PersonList.add(new Person2("張三", 11, BigDecimal.valueOf(10000), BigDecimal.valueOf(0.08)));
PersonList.add(new Person2("李四", 21, BigDecimal.valueOf(20000), BigDecimal.valueOf(0.18)));
PersonList.add(new Person2("王五", 31, BigDecimal.valueOf(30000), BigDecimal.valueOf(0.28)));
PersonList.add(new Person2("趙四", 41, BigDecimal.valueOf(40000), BigDecimal.valueOf(0.38)));
}
/**
* 計(jì)算
*/
@Test
public void testCalcAgeAndMoney() {
// 計(jì)算年齡之和
Integer ages = PersonList.stream().map(Person::getAge).reduce((a, b) -> (a + b)).get();
System.out.println(ages);
// money是資產(chǎn),rateOfReturn 是資產(chǎn)年收益率,計(jì)算一年后幾人的資產(chǎn)總額
BigDecimal assetsAmt = PersonList.stream().map(person ->
person.getMoney().multiply(person.getRateOfReturn().add(BigDecimal.ONE))).reduce(BigDecimal::add).get();
System.out.println(assetsAmt);
}
}
3. 涉及方法
stream()
/*
* 返回以此集合為源的順序流。
* 當(dāng)spliterator()方法不能返回IMMUTABLE、CONCURRENT或后期綁定的分裂器時(shí),應(yīng)該重寫(xiě)此方法。(詳見(jiàn)spliterator())
*/
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
stream是Collection的一個(gè)默認(rèn)方法,它的作用是返回集合的stream流
用法:
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
map(Function<? super T, ? extends R> mapper)
// 返回一個(gè)流,由將給定函數(shù)應(yīng)用于此流的元素的結(jié)果組成。
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
Stream的方法,作用是返回一個(gè)流,里面的數(shù)據(jù)使我們定義的,比如:
stream.map(Person::getAge);
其中 Person::getAge
定義的就是“年齡”,map方法會(huì)為我們返回一個(gè)僅包含“年齡”的stream
我們可以接著調(diào)用collect方法,獲取到一個(gè)list集合。
List<Integer> ageList = stream.map(Person::getAge).collect(Collectors.toList());
reduce
// 使用關(guān)聯(lián)累加函數(shù)對(duì)此流的元素執(zhí)行縮減,并返回描述縮減值(如果有的話)的Optional。
Optional<T> reduce(BinaryOperator<T> accumulator);
其中的參數(shù)表示對(duì)兩個(gè)相同類型的操作數(shù)的操作,產(chǎn)生與操作數(shù)相同類型的結(jié)果。這是BiFunction的專門化,用于操作數(shù)和結(jié)果都是同一類型的情況。其中的參數(shù):
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T>
簡(jiǎn)單來(lái)說(shuō),reduce方法就是將stream流中的多個(gè)元素縮減為一個(gè)我們想要的結(jié)果??s減的規(guī)則,就是我們傳入的表達(dá)式 ,比如
PersonList.stream().map(Person::getAge).reduce((a, b) -> (a + b)).get();
(a,b) -> (a + b)
表示將流中的元素進(jìn)行累加操作,并返回包含累加結(jié)果的Option,而get()
方法,則是獲取Option中的累加結(jié)果。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-421207.html
通過(guò)一系列的操作,便獲得了集合中投資人年齡之和。Stream流還有很多其他的用法有待學(xué)習(xí),用的熟練了,確實(shí)可以提升不少效率,并且對(duì)于一些疑難的問(wèn)題它都可以很好的解決。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-421207.html
到了這里,關(guān)于stream流的使用-獲取list集合中對(duì)象的單個(gè)字段list集合,進(jìn)行累加操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!