首页 > 其他分享 >Stream实战用例1

Stream实战用例1

时间:2023-11-04 14:45:28浏览次数:34  
标签:实战 BigDecimal Stream Person stream valueOf List 用例 new

Java8 Stream 代码少,功能强大,实乃效率利器。这里我列举自己常用的Stream使用示例。

一.流式赋值

1. 从一个List转到另一个List

参考

objectList = objectList .stream().map(object -> {
             Object objectNew = new Object();
             BeanUtils.copyProperties(object, objectNew);
             objectNew.setVar("Value");
             return objectNew;
             }).collect(Collectors.toList());

2. 简单赋值

// 单个
objectList.forEach(object -> object.setVar("Value"));
// 多个
objectList.forEach(object -> {
    object.setVar("Value");
    object.setVar2("dfsfsd");
});

二.统计计算

参考

// BigDecimal求和
public static void main(String[] args) {

        List<Invoice> invoices = Arrays.asList(
                new Invoice("I1001", BigDecimal.valueOf(9.99), BigDecimal.valueOf(1)),
                new Invoice("I1002", BigDecimal.valueOf(19.99), BigDecimal.valueOf(1.5)),
                new Invoice("I1003", BigDecimal.valueOf(4.888), BigDecimal.valueOf(2)),
                new Invoice("I1004", BigDecimal.valueOf(4.99), BigDecimal.valueOf(5)),
                new Invoice("I1005", BigDecimal.valueOf(.5), BigDecimal.valueOf(2.3))
        );

        //增加非空校验
        BigDecimal sum = invoices.stream()
                .map(x -> x.getQty().multiply(x.getPrice()))    // map
                .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);      // reduce
        	
        System.out.println(sum);    // 75.851
        System.out.println(sum.setScale(2, RoundingMode.HALF_UP));  // 75.85

}


// 计数
long count = ls.stream().filter(s -> s.length() == 3).count();

3. 自定义Predicate进行复杂逻辑filter

复杂的逻辑过滤,可以写一个谓语判断
 Predicate<TestObject> showIndicatorPre = adjustByCityUtil -> {
            boolean isShow = false;
            BigDecimal score = adjustByCityUtil.getScore();
            BigDecimal benchmarkScore = adjustByCityUtil.getBenchmarkScore();
            String scoreAdjustReason = adjustByCityUtil.getScoreAdjustReason();

            if( score != null) {
                if (benchmarkScore != null) {
                    isShow = !(benchmarkScore.compareTo(score) == 0);
                } else if (StringUtils.isNotBlank(scoreAdjustReason)) {
                    isShow = true;
                }
            }
            return isShow;
        };


        List<TestObject> adjustByCityUtils = entry.getValue();
        if(CollectionUtils.isNotEmpty(adjustByCityUtils)) {
            List<TestObject> collect = adjustByCityUtils.stream().filter(showIndicatorPre).collect(Collectors.toList());
            entry.setValue(collect);
        }
      ...

4.List转Map

@Data
public class Person {

    private Integer idNum;

    private String name;

    private Integer age;
}
List<Person> personList = Arrays.asList(
                new Person(1, "Jack", 3),
                new Person(2, "Mary", 4),
                new Person(3, "Harry", 6),
                new Person(4, "Ali", 6)
        );

// 4.0 只需要List中的两个元素,一个作key,一个为value
Map<Integer,String> testMap = personList .stream()
                .collect(Collectors.toMap(Person::getIdNum, Person::getName));

// List每个元素的key不相同,value是一个列表中的一个元素
Map<String, Person> testMap2 = personList .stream()
.collect(Collectors.toMap(Person::getName, a -> a, (k1, k2) -> k1));

// List中的 key有相同的,value是一个List,将 同Key的进行分组

// 1. 不保持查询顺序的分组
Map<Integer, List<Person>> personSameAgeMap = personList .stream()
.collect(Collectors.groupingBy(Person::getAge));

// 2. 保持查询顺序的分组
使用LinkedHashMap来保证Map中的Key的先后顺序与在List中的先后顺序保持一致
LinkedHashMap<String, List<Person>> personSameAgeMap2= personList.stream()
          .collect(Collectors.groupingBy(Person::getAge, LinkedHashMap::new, Collectors.toList()));

BTW:
List转Map主要是为了搜索匹配方便,从n的复杂度变成1的复杂度。
组织形式变了,但是里面元素还是没变,因此对Map中任何一个元素的值的修改,
都会永久的修改,无论是List,还是在Map中。

5.遍历搜索查看列表中是否有任何一个符合的数据

● filter 搭配 findAny(findFirst) 搭配 isPresent()

    /**
     * 判断每列表中是否有大于6岁的人
     * @param indicatorCityScoreList
     * @return
     */
    private boolean validateAllPersonAgeIsLargerThanTwo(List<Person> personList) {
        Optional<Person> any = personList.stream()
                .filter(i -> (i.getAge() > 6)).findAny();
        if(any.isPresent()) {
            return false;
        }
        return true;
    }

未完待续。。。

标签:实战,BigDecimal,Stream,Person,stream,valueOf,List,用例,new
From: https://www.cnblogs.com/it-bt/p/17807092.html

相关文章

  • java——redis随笔——实战——分布式缓存——主从
                                                                               ......
  • CMake实战
    CMake实战1.Preface  通过CMake来实际构建一个项目,掌握cmake的使用流程;在之前的博客!《CMake学习记录》中,介绍了Cmake相关的基础知识;2.需要注意的问题add_subdirectory存在问题file命令的使用程序版本信息设置如何指定编译时的编译器编译选项设置暂时想到这么多......
  • java——redis随笔——实战——分布式缓存
    在使用Redis过程中,持久化是一项非常重要的功能,因为如果RedisServer停止工作,所有的数据将全部丢失。 为了避免这种情况的出现,我们需要将Redis中的数据保存在硬盘上,以保证数据不受服务器宕机影响。 Redis提供了两种持久化方式——RDB和AOF。    笔者将会以RDB与AOF......
  • Go语言定时器实战:性能优化与实用技巧
    Go语言定时器实战:性能优化与实用技巧原创 Go先锋 Go先锋 2023-11-0307:58 发表于广东收录于合集#Go语言包29个Go先锋读完需要8分钟速读仅需3分钟  概述在日常开发中,定时器是一个非常常用且重要的功能。它可以让程序在特定的时间间隔内执行某些任务,比......
  • OpenVAS扫描器实战
    要检查OpenVAS是否安装,可以使用以下命令在终端中检查其版本号:openvas-check-setup--version如果OpenVAS已安装,则会显示版本号。如果未安装,则会显示错误消息。另外,您还可以使用以下命令检查OpenVAS服务是否正在运行:openvas-check-setup--version如果服务正在运行,则会显示“active......
  • GO语言使用redis stream队列demo
    GO语言使用redisstream队列demopackagemainimport( "context" "fmt" "github.com/go-redis/redis/v8" "time")varclient*redis.Clientvarctxcontext.Contextvarkey="my_streamKey"//keyvarmyCons......
  • Go语言百万高薪开发架构师一线大牛亲授+企业项目实战+云原生架构核心
    Go语言百万高薪开发架构师一线大牛亲授+企业项目实战+云原生架构核心 第1章云原生架构1.1云计算的历史1.1.3容器的横空出世和容器编排大战上一次我们提到了PaaS,PaaS的开源产品Docker对云计算领域产生了深远的影响,从虚拟机到容器,整个云计算市场发生了一次重大变革。容......
  • Go语言Golang DevOps运维开发实战集训营,高级运维必修
    Go语言GolangDevOps运维开发实战集训营,高级运维必修Go语言简介Go语言,也称为Golang,是一门由Google开发的开源编程语言。它的设计目标是提供一种高效、简洁、安全且支持并发的编程语言,适用于构建可靠且高性能的软件系统。Go语言在短短的时间内迅速走红,成为开发者们喜爱的选择,因......
  • 带你了解 Stream 的使用,提升集合开发效率
    当涉及Java编程时,JavaStream是一个功能强大且高效的工具,用于处理集合数据。它提供了一种声明式的方式来操作数据,可以显著简化代码并提高可读性。在本文中,我们将深入探讨JavaStream,介绍其基本概念、常用操作和用例。什么是JavaStreamJavaStream是Java8引入的一种新的抽......
  • Vue+OpenLayers从入门到实战进阶案例汇总目录,兼容OpenLayers7和OpenLayers8
    本篇作为《Vue+OpenLayers入门教程》和《Vue+OpenLayers实战进阶案例》所有文章的二合一汇总目录,方便查找。本专栏源码是由OpenLayers结合Vue框架编写。本专栏从Vue搭建脚手架到如何引入OpenLayers依赖的每一步详细新手教程,再到通过各种入门案例和综合性的实战案例,带领大家快速......