Collectors.collectingAndThen()Collectors.collectingAndThen 去重Stream分组groupBy后取单一字段值、取列表第一个值方式

Collectors.collectingAndThen()

Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map and reduce 操作,或者统计操作。

Collectors.collectingAndThen() 函数应该最像 map and reduce 了,它可接受两个参数,第一个参数用于 reduce操作,而第二参数用于 map操作。

也就是,先把流中的所有元素传递给第一个参数,然后把生成的集合传递给第二个参数来处理。

例如下面的代码

  1. [1,2,3,4] 这个集合传递给 v -> v * 2 lambda表达式,计算得出结果为[2,4,6,8]
  2. 然后再把 [2,4,6,8]传递给 Collectors.averagingLong 表达式,计算得出 5.0
  3. 然后传递给 s -> s * s lambda表达式,计算得到结果为 25.0

collectingAndThenExample测试

@Test
public void collectingAndThenExample() {List<Integer> list = Arrays.asList(1, 2, 3, 4);Double result = list.stream().collect(Collectors.collectingAndThen(Collectors.averagingLong(v -> {System.out.println("v--" + v + "--> " + v * 2);return v * 2;}),s -> {System.out.println("s--" + s + "--> " + s * s);return s * s;}));System.out.println(result);
}

collectingAndThenExample结果

v--1--> 2
v--2--> 4
v--3--> 6
v--4--> 8
s--5.0--> 25.0
25.0

一点唠叨:

  • 相对于Collectors.averagingDouble()来说,方法体只执行一次。
  • 相对于Collectors.averagingDouble()来说,方法体做出了优化
  • 相对于Collectors.averagingDouble()来说,这个没有坑
  • ……
  • 为什么这么提Collectors.averagingDouble(),因为Collectors.averagingDouble()有坑,有坑,有坑


Collectors.collectingAndThen 去重

  • Adapts a Collector to perform an additional finishing transformation
  • 对结果集收集的结果再用function函数进行处理,第一个参数是Collector,可以使用Collectors里面的各种工具类
public static <T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)

应用:根据list中对象某属性进行去重

List<Student> studentList = new ArrayList<>();
studentList.add(new Student("111", 132774, 12, "1"));
studentList.add(new Student("123", 13556, 15, "1"));
studentList.add(new Student("1146", 13165142, 16, "1"));
studentList.add(new Student("111", 136542, 14, "2"));
studentList.add(new Student("141321", 5641542, 15, "2"));
studentList.add(new Student("1454135", 2222542, 15, "2"));List<Student> collect = studentList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection( () -> new TreeSet<>(Comparator.comparing(Student::getStuName))),ArrayList::new));System.out.println(collect.size());// 等效处理   此处在treeSet构造方法中传入比较器 可以自定义比较器传入
TreeSet<Student> treeSet = new TreeSet<>(Comparator.comparing(Student::getStuName));
treeSet.addAll(studentList);
List<Student> treeCollect = new ArrayList<>(treeSet);System.out.println(treeCollect.size());

output

Student{stuName='111', stuId=132774, stuAge=12, classNum='1'}
Student{stuName='1146', stuId=13165142, stuAge=16, classNum='1'}
Student{stuName='123', stuId=13556, stuAge=15, classNum='1'}
Student{stuName='141321', stuId=5641542, stuAge=15, classNum='2'}
Student{stuName='1454135', stuId=2222542, stuAge=15, classNum='2'}
  • 第一种方法的finisher调用的是ArrayList(Collection c),所以就是把Collector downstream的结果再给到Function finisher去处理,用toCollection收集结果
  • 第二种用treeSet就是用比较器来进行排序去重,如果compareTo返回0,说明是重复的,返回的是自己的某个属性和另一个对象的某个属性的差值,如果是负数,则往前面排,如果是正数,往后面排。在set放元素时,是一个循环比较的过程,一旦有一个相等,就不再比较。
  • ComparTo()方法是一个比较方法,比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。默认为零系统认为都是同一个对象,所以只存入一个,因为Set集合的无序、唯一性

Stream分组groupBy后取单一字段值、取列表第一个值方式

取某字段成为列表

Map<String, List<String>> ruleMap1 = ruleList.stream()..collect(Collectors.groupingBy(Rule::getId,Collectors.mapping(Rule::getRuleName, Collectors.toList())));

取列表中第一个值

        Map<String, Rule> ruleMap = ruleList.stream()..collect(Collectors.groupingBy(Rule::getId,Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyBoot如何使用?EasyBoot制作多系统启动盘教程

在平时的工作中&#xff0c;我们会安装很多软件&#xff0c;虽然用完卸载了&#xff0c;但是还是会有残留占用资源&#xff0c;于是我们就得去看一下系统资源&#xff0c;可是很多用户不知道系统资源怎么看&#xff1f;其实方法很简单&#xff0c;如果你不知道Windows7系统资源…

问题:在使用dubbo 2.5.3之前的版本@Service来发布服务时,当该服务中有@Transactional,是无法正常发布的?

问题&#xff1a;在使用dubbo 2.5.3之前的版本Service来发布服务时&#xff0c;当该服务中有Transactional,是无法正常发布的? 解决方案&#xff1a; 因为事务TransactionManagement默认是使用了jdk的代理即基于接口的代理&#xff0c;必须改成基于类的代理&#xff0c;servi…

win7发现不了无线网络怎么办 win7发现不了无线网络的解决办法

今天来跟各位说说win7发现不了无线网络怎么办。 1.我们单击右下角的无线网络以打开网络和共享中心。 2.单击“更改适配器设置”。 3.在“网络连接”窗口中&#xff0c;如果网络连接中的无线网络显示为灰色&#xff0c;则右键单击“启用”。 4.在网络连接中没有无线网络连接&…

win7分辨率不能调怎么办 win7系统分辨率不能调的解决方案

win7分辨率不正常怎么回事?分辨率为什么不能调?win7分辨率不能调是什么原因?怎么来解决win7分辨率不能调的问题?现在小编就分享一篇关于win7系统分辨率不能调的解决方案。 分辨率对系统来说是相当重要的&#xff0c;这关系到系统桌面屏幕的清晰度&#xff0c;如果调得不好…

Mybatis-Plus字段策略FieldStrategy详解

文章目录一、官方文档二、字段策略介绍1、FieldStrategy作用2、FieldStrategy类型3、FieldStrategy配置全局策略配置单字段策略配置三、实战说明1.默认策略 - NOT_NULL2.忽略判断-IGNORED3.从不处理-NEVER4.字符不为空-NOT_EMPTY5.跟随全局-DEFAULT总结一、官方文档 Mybatis-P…

移动硬盘接口坏了怎么办解决教程

移动硬盘由于在使用中掉落或者经常插拔&#xff0c;会导致移动硬盘的接口的损坏&#xff0c;其实就是移动硬盘端的usb接口的损坏&#xff0c;而很多时候只是这个接口的焊点松动&#xff0c;有时候确是本身掉落金属手指导致损坏&#xff0c;而其实解决方法真正有效的有两种。 移…

任意门怎么用团发_衣柜门选用什么材料好?小编在这里告诉你

衣柜是美观家庭必不可少的&#xff0c;它我们的空间看起来更整洁。但是衣柜的材料值得我们好好考虑一下。衣柜门有哪些材质1、铝合金铝合金材质的衣柜门在日常生活中比较常见&#xff0c;使用得比较多。这是因为其环保性能比较好&#xff0c;而且十分耐用&#xff0c;还具有较强…

Google Gson API 介绍与使用

文章目录Gson基本操作Gson 概述与下载Gson (反)序列化 Java 对象JsonElement Json 元素JsonObject Json 对象JsonArray Json 数组JsonParser Json 解析GsonBuilder 构建 GsonJsonElement的简单说明JsonElement&#xff1a;JsonPrimitive&#xff1a;JsonNull:JsonArray:JsonObj…

移动硬盘读取速度一般是多少

移动硬盘现在已经普及很高了&#xff0c;几乎有存储需要的朋友都有一个移动硬盘&#xff0c;而且现在的移动硬盘已经升级到usb3.0的了&#xff0c;以前的usb2.0的移动硬盘逐渐淘汰&#xff0c;那么很多朋友在问移动硬盘的读取速度一般是多少算正常呢&#xff0c;下面就给大家测…

光功率 博科交换机_如何将交换机40G QSFP+与10G SFP+端口互连?

随着40G以太网的到来&#xff0c;许多企业用户开始充分利用当前的10G网络设备升级到40G网络&#xff0c;具体来说也就是如何将带有QSFP端口的40G交换机与现有带SFP端口的10G设备(交换机和服务器)搭配使用的问题。在本篇文章中&#xff0c;易天光通信(ETU-LINK)将分享三种常见的…

Gson使用Gson工具类GsonUtils(项目中要求不要使用Fastjson,原因:Fastjson存在安全漏洞)

一、概述 Gson是google提供的用来操作json数据的一个非常好用的类库。其使用范围非常的广泛&#xff0c;所以非常有必要对其进行系统的学习。 json是一种数据格式&#xff0c;确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。 目前大多数的网络通讯格式已经从…

浅析怎样提升win7 旗舰版系统显示质量

今天小编给大家浅析怎样提升win7 旗舰版系统显示质量&#xff0c;大家一起来了解下吧&#xff0c;具体如下&#xff1a; 一、打开的程序或窗口的数量尽量减少 当你打开的程序越多&#xff0c;Windows 所需的系统资源也就越多。请将当前没有使用的程序关闭&#xff0c;或缩小窗…

keil 函数最多可以传几个参数_007 函数进阶,来做一次比较正式的作业

这节课开始之前&#xff0c;先来解决一个小问题。最近这两节课&#xff0c;有人对缩进的规则不太理解&#xff0c;这里解释一下。如上图所示&#xff0c;相同的缩进代表同一个代码块&#xff0c;即同一个顺序执行代码段落。如果代码缩进减少&#xff0c;则说明当前代码块结束&a…

Win7休眠后唤醒出现黑屏的解决办法

进入睡眠状态可很好地节约电源和延长硬件的使用寿命&#xff0c;很多用户的电脑进入睡眠状态后&#xff0c;唤醒无法正常进入屏幕&#xff0c;而是变成黑屏的故障&#xff0c;怎么回事?其实出现这种情况并非什么系统故障问题&#xff0c;下面小编给大家分享Win7休眠后唤醒出现…

Map按照Value值进行排序的实现

Map按照Value值进行排序的实现 map.entrySet().stream().sorted(Comparator<? super T> comparator)给定一个map&#xff0c;存储一个nums数组中每一个数字存储的次数&#xff0c;最后将这个map按照value值&#xff0c;即出现的次数进行排序 第一种方式&#xff1a;返…

传授电脑蓝屏开不了机怎么办

电脑是现代社会不可缺少的重要工具&#xff0c;不仅可以帮助处理复杂的数据&#xff0c;还可以辅助教学&#xff0c;设计&#xff0c;聊天娱乐。下面&#xff0c;我就给大家介绍一下电脑蓝屏开不了机的解决方法&#xff0c;有需要就引起来了解一下吧 大家在使用电脑的时候有没…

华为核心交换如何配置源地址转换_华为三层交换机配置步骤解释资料全

word格式文档专业整理华为三层交换机配置步骤1.给交换机划分VLANVlan是虚拟局域网的意思&#xff0c;它相当于一个局域网工作组。“vlan几”可以理解成编号为几的vlan&#xff0c;比如vlan 2就是编号为2的vlan&#xff0c;只是一个编号而已&#xff0c;并不是说vlan 2的网段一定…

关于Gson的TypeToken

文章目录引言Type是什么获取类型的困惑自定义TypeToken解决问题总结引言 Gson在Json解析中使用广泛, 常用的数据类型都可以解析, 特殊的可以自定义Adapter解析. 在解析大量具有某些相同结构的数据上,我们总想复用已有的类型, 为了复用通常可以使用继承和泛型. 比如服务端返回的…

如何用U盘之家U盘启动盘制作工具实现U盘装系统

若你有一个U盘&#xff0c;本文就带你实现如何来U盘装系统&#xff0c;完全丢掉你的光驱&#xff0c;虽然这个工具比较老了&#xff0c;但教程一样的适用于现在的电脑。 需要的环境&#xff1a; 本文制作出来的引导方式为USB-HDD或USB-ZIP&#xff0c;无需量产&#xff0c;U盘…

信号回勾产生的原因_燃气减压阀振动的原因及处理方案

燃气减压阀是一种自动降低管路工作压力的专门装置&#xff0c;作用是在给定减压范围后&#xff0c;可以将较高压力的介质减到给定压力。它可将阀前管路较高的液气体压力减少至阀后管路所需的水平。燃气减压阀是各装置广泛使用的仪表之一&#xff0c;它准确正常地工作对保证工艺…