stream流的使用-获取list集合中对象的单个字段list集合,进行累加操作

这篇具有很好参考价值的文章主要介绍了stream流的使用-获取list集合中对象的单个字段list集合,进行累加操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Stream流的使用

场景及代码案例源于实际项目

1. 需求描述

现存一list集合,其中保存了投资人的信息。
Person (name, age, money rateOfReturn)
其中的money表示投资人现有资产,rateOfReturn表示投资年回报率
需求:
1.计算投资人年龄之和;
2.根据现有资产及投资回报率,计算所有投资人一年后的资产总和;

2. 代码

实体类

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)));
    }
    /**
    *  计算
    */
    @Test
    public void testCalcAgeAndMoney() {
        // 计算年龄之和
        Integer ages = PersonList.stream().map(Person::getAge).reduce((a, b) -> (a + b)).get();
        System.out.println(ages);
        
        // money是资产,rateOfReturn 是资产年收益率,计算一年后几人的资产总额
        BigDecimal assetsAmt = PersonList.stream().map(person ->
                person.getMoney().multiply(person.getRateOfReturn().add(BigDecimal.ONE))).reduce(BigDecimal::add).get();
        System.out.println(assetsAmt);
    }
}

3. 涉及方法

stream()

/*
* 返回以此集合为源的顺序流。
* 当spliterator()方法不能返回IMMUTABLE、CONCURRENT或后期绑定的分裂器时,应该重写此方法。(详见spliterator())
*/
default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }

stream是Collection的一个默认方法,它的作用是返回集合的stream流
用法:

List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();

map(Function<? super T, ? extends R> mapper)

// 返回一个流,由将给定函数应用于此流的元素的结果组成。
<R> Stream<R> map(Function<? super T, ? extends R> mapper);

Stream的方法,作用是返回一个流,里面的数据使我们定义的,比如:

stream.map(Person::getAge);

其中 Person::getAge定义的就是“年龄”,map方法会为我们返回一个仅包含“年龄”的stream
我们可以接着调用collect方法,获取到一个list集合。

List<Integer> ageList = stream.map(Person::getAge).collect(Collectors.toList());

reduce

// 使用关联累加函数对此流的元素执行缩减,并返回描述缩减值(如果有的话)的Optional。
Optional<T> reduce(BinaryOperator<T> accumulator);

其中的参数表示对两个相同类型的操作数的操作,产生与操作数相同类型的结果。这是BiFunction的专门化,用于操作数和结果都是同一类型的情况。其中的参数:

@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T>

简单来说,reduce方法就是将stream流中的多个元素缩减为一个我们想要的结果。缩减的规则,就是我们传入的表达式 ,比如

PersonList.stream().map(Person::getAge).reduce((a, b) -> (a + b)).get();

(a,b) -> (a + b) 表示将流中的元素进行累加操作,并返回包含累加结果的Option,而get()方法,则是获取Option中的累加结果。

通过一系列的操作,便获得了集合中投资人年龄之和。Stream流还有很多其他的用法有待学习,用的熟练了,确实可以提升不少效率,并且对于一些疑难的问题它都可以很好的解决。文章来源地址https://www.toymoban.com/news/detail-421207.html

到了这里,关于stream流的使用-获取list集合中对象的单个字段list集合,进行累加操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java8特性,Stream流的使用,收集成为map集合

    Java 8引入了Stream API,这是Java集合操作的一个重大改进。Stream API提供了一种高效且易于使用的处理数据的方式。 Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。注意:Stream自己不会存储元素,它不会改变源对象,反而它的操作会返回一个全新的Strea

    2024年04月22日
    浏览(62)
  • Java中List对象集合按照对象中某字段进行排序

    在Java中,可以使用List集合对象的sort(Comparator? super E c)方法,按照对象中某字段对List集合进行排序 栗子: 打印输出结果如下:

    2024年02月12日
    浏览(43)
  • Java8 stream、List forEach 遍历对象 List 对某一字段重新赋值

    Java8 stream、List forEach 遍历对象 List 对某一字段重新赋值 经常会需要遍历对象 List 对某一字段重新赋值,使用 Java8 stream 或者 List forEach 操作实现非常便捷。 一、Java8 stream 操作 示例代码如下: 二、List forEach 操作 示例代码如下: 将 Object 替换为需要提取的对象即可。 遍历对象

    2024年02月16日
    浏览(37)
  • java 对List集合中元素对象按字段分组,并收集指定字段的值

    一、实现:对已有对象集合ListPersion ,需要获取Persion对象的字段 name分组, 并对年龄age字段值做收集 二、字段分组收集方法  注:由于实际业务只有String类型跟数字类型,所以只对String跟Object两种类型判空 三、测试代码 四、结果

    2024年02月15日
    浏览(33)
  • Stream流实践(二):list 对象数组根据某字段去重的三种基本思路

    相信大家对于list简单数组的去重很熟悉了,例如以下代码 那我们来探讨下,对于list中保存为对象的数组,根据内部对象的 某一个字段 去重有什么好的思路呢? 给出一个简单的Student对象 大家学废了吗?

    2024年02月16日
    浏览(27)
  • Java中用Stream流对List对象集合转Map时key值重复的操作

    看完你还不懂,你直接喷·· 定义: 1.List是一个装Dto对象的集合 2.Dto里面有ID属性,name属性等等 3.Dto里面的ID会重复  现在要把List转成以ID为key值的map,明显key不能重复啊,所以应该怎么操作呢? (需要你有java8Stream流的基本概念,map的基本概念)   操作1:重复key,选择保留

    2024年01月18日
    浏览(37)
  • stream(流) 获取list里面对象的某个值的列表

    — 获取userList里面的name值组成列表 User.java mian 结果

    2024年02月17日
    浏览(35)
  • JAVA中对list使用stream对某个字段求和

    对于List对象 或者ListMapString,integer等类型的数组,如何快速的求出list数组中某个对象的某个属性的和,平均数,统计数,最大值,最小值,等: 使用 XXXSummaryStatistics统计类实现: 运行结果如下: 相应的还有DoubleSummaryStatistics, LongSummaryStatistics

    2024年02月14日
    浏览(29)
  • java 8 stream流的19种用法,可应对大多数集合的处理场景

    java 8的Stream API是一种非常强大的集合处理工具,它提供了一种新的、高效的、声明式的方式来处理集合数据。下面我们就来看一下Java 8 Stream API的所有用法。 可以使用Stream.of()方法创建一个Stream: 也可以使用集合的stream()方法创建一个Stream: 可以使用filter()方法过滤Stream中的

    2023年04月08日
    浏览(65)
  • java通过stream流的形式把列表中某个字段的值取出并生成列表

    可以使用Java 8中引入的Stream API来实现这一功能。例如,假设你有一个类名为Person的列表,并且你想要从这个列表中提取所有人的姓名并生成一个新的列表。你可以这样做: 这段代码首先使用 stream() 方法将列表转换为流。然后,使用 map() 方法对流中的每个元素执行一个转换函

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包