Java 8:按集合分组

在继续阅读Venkat Subramaniam的“ Java函数式编程 ”时,我到达了介绍Stream#collect函数的那部分。

我们想收集一个人,按年龄分组,并返回一张方便的(年龄->人名)地图。

要刷新,这是Person类的样子:

static class Person {private String name;private int age;Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return String.format("Person{name='%s', age=%d}", name, age);}
}

我们可以用Java 8编写以下代码来获取按年龄分组的人的名字的地图:

Stream<Person> people = Stream.of(new Person("Paul", 24), new Person("Mark", 30), new Person("Will", 28));
Map<Integer, List<String>> peopleByAge = people.collect(groupingBy(p -> p.age, mapping((Person p) -> p.name, toList())));
System.out.println(peopleByAge);
{24=[Paul], 28=[Will], 30=[Mark]}

我们在集合上运行“集合”功能,并在进行时按“年龄”属性进行分组,并对人员姓名而不是人员本身进行分组。

这与您在Ruby中所做的有点不同,在Ruby中您可以调用一个“ group_by”函数:

> people = [ {:name => "Paul", :age => 24}, {:name => "Mark", :age => 30}, {:name => "Will", :age => 28}]
> people.group_by { |p| p[:age] }
=> {24=>[{:name=>"Paul", :age=>24}], 30=>[{:name=>"Mark", :age=>30}], 28=>[{:name=>"Will", :age=>28}]}

这会向我们提供按年龄分组的人员列表,但是我们需要应用其他“地图”操作来将其更改为姓名列表:

> people.group_by { |p| p[:age] }.map { |k,v| [k, v.map { |person| person[:name] } ] }
=> [[24, ["Paul"]], [30, ["Mark"]], [28, ["Will"]]]

在这个阶段,我们有一个(年龄,名字)对的数组,但是幸运的是Ruby 2.1.0有一个函数“ to_h”,我们可以调用它来再次返回哈希:

> people.group_by { |p| p[:age] }.map { |k,v| [k, v.map { |person| person[:name] } ] }.to_h
=> {24=>["Paul"], 30=>["Mark"], 28=>["Will"]}

如果要在对集合执行归约操作时遵循Java按属性分组的方法,我们将具有以下内容:

> people.reduce({}) { |acc, item| acc[item[:age]] ||=[]; acc[item[:age]] << item[:name]; acc }
=> {24=>["Paul"], 30=>["Mark"], 28=>["Will"]}

如果我们使用Clojure,则可能会得到如下所示的结果:

(def people[{:name "Paul", :age 24} {:name "Mark", :age 30} {:name "Will", :age 28}])> (reduce (fn [acc [k v]] (assoc-in acc [k] (map :name v))) {} (group-by :age people))
{28 ("Will"), 30 ("Mark"), 24 ("Paul")}

我以为Java版本一开始看起来有点怪异,但是用其他几种语言解决了这个问题,实际上还不错。

最好知道是否有更好的方法来执行Ruby / Clojure方法!

参考: Java 8:通过 Mark Needham博客博客的JCG合作伙伴 Mark Needham的收藏进行分组 。

翻译自: https://www.javacodegeeks.com/2014/02/java-8-group-by-with-collections.html

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

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

相关文章

android linux截图库,Android中截图(surfaceView)源码

总结了一个方法&#xff0c;实现了在Android当前Activity的截图&#xff0c;本人测试确实通过了&#xff0c;不过有朋友说截出来的图是黑色的&#xff0c;不能看。我心想&#xff0c;这没有问题啊&#xff0c;相同的代码我就可以执行通过&#xff0c;并没有没有在意这个问题。可…

xmta温度控制仪说明书_XMT系列数显温度控制器使用说明书

测温元件名称分度号测温范围℃分辩率热电偶镍铬—铜镍E(EA—2)0 - 300、0 - 400、0 - 6001℃镍铬—镍硅K(EU—2)0-400、0-600、0-800、0-1300铂铑—铂S(LB—3)0 - 1600、700 - 1600热电阻铜电阻Cu50(G)-50-150、0-50、0-100、0-1500.1℃铂电阻Pt100(BA1、BA2)-199 - 199、0 - 1…

WARNING: 'aclocal-1.14' is missing on your system.

源码安装zabbix agent时进行到make install时报如下错误&#xff1a; WARNING: aclocal-1.14 is missing on your system.You should only need it if you modified acinclude.m4 orconfigure.ac or m4 files included by configure.ac.The aclocal program is part of the GNU…

23套新鲜出炉的网站和手机界面 PSD 素材

Web 用户界面&#xff0c;移动用户界面和线框套件对设计师很有用&#xff0c;因为这些套件让他们使用快速和有效的方式复制用户界面。这些类型的工具包提供了一个基本的用户界面元素&#xff0c;用于它们需要制作的网站或软件模型。 在这篇文章中&#xff0c;我们展示的是自由和…

arcgis栅格邻域统计_ArcGIS 从基础到实战书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序...

《ArcGIS 从基础到实战》书正式出版&#xff0c;易智瑞技术总裁沙志友沙总推荐并亲自写序&#xff0c;京东地址 https://item.jd.com/10025512034581.html第一章 ArcGIS基础和入门 11.1 ArcGIS 10.7 Desktop的安装 11.1.1 安装环境 11.1.2 安装步骤 21.1.3 注意的问…

date简述

Date 定义时间和日期的类 java.util.Date 1s1000ms; 时间的原点&#xff1a;公元1970年1月1日 00点00分00秒&#xff1b; public class DateDemo {public static void main(String[] args) {fun();}private static void fun() {Date dnew Date(0);System.out.println(d)…

WebLogic Classloader分析工具

WebLogic Server具有一个名为Classloader Analysis Tool的内置Web应用程序&#xff0c;您可以通过http&#xff1a;// localhost&#xff1a;7001 / wls-cat访问它 您需要使用为/ console Webapp配置的同一用户登录。 使用CAT&#xff0c;您可以检查应用程序在服务器中加载了哪…

python3 计算rsa私钥 已知n e计算d

# 分解模数n def rsa_moder(n):base 2while base < n:if n % base 0:return base, n // basebase 1# 求欧拉函数f(n) def rsa_get_euler(prime1, prime2):return (prime1 - 1) * (prime2 - 1)# 求私钥 def rsa_get_key(e, euler):k 1while True:if (((euler * k) 1) % …

linux算法平台,Linux实时调度算法与测试平台的研究与实现

摘要&#xff1a;实时系统在过去几年里迅速成长,但能够提供实时功能的操作系统往往价格极为昂贵.由于Linux代码公开,且性能优异,使其成为实时操作系统领域里的新宠.然而Linux本身作为一个通用的分时操作系统,将它应用于实时环境有许多缺点和不足,所以要对现有的Linux进行实时化…

Maplace.js – 小巧实用的 jQuery 谷歌地图插件

Maplace.js是一个小的显示谷歌地图的 jQuery 插件&#xff0c;帮助你把谷歌地图嵌入到你的网站&#xff0c;快速在地图位置上创建标记和控制菜单。它需要 jQuery 和谷歌地图 API v3 支持&#xff0c;所以这两个都需要引入到你的页面。它支持标记和自定义图标、缩放级别和自定义…

vue.js根据数据循环生成表格_vue.js循环for(列表渲染)详解

vue.js循环for(列表渲染)详解一、总结一句话总结&#xff1a;v-for{{ item.message }}var example1 new Vue({el: #example-1,data: {items: [{ message: Foo },{ message: Bar }]}})1、vue.js中的循环结构(列表渲染:for)如何使用&#xff1f;v-for用于循环的数组里面的值可以…

使用Spring Roo进行概念验证

在Keyhole期间&#xff0c;我参与了许多项目&#xff0c;其中客户要求我们重写旧系统&#xff0c;同时保留其现有数据库。 有时&#xff0c;它有助于快速演示如何使用当前技术来简化开发&#xff0c;测试和维护其代码。 我发现可以创建一个快速示例&#xff08;与当前项目相关…

z490 linux raid,华硕z490主板装win7系统及bios设置教程(支持10代usb驱动)

[文章导读]我们在组装电脑时&#xff0c;华硕主板可能是大家的首选&#xff0c;最近有网友问&#xff0c;我组装的华硕z490主板电脑怎么装win7系统呢&#xff0c;这里和大家说下&#xff0c;从华硕z490主板后默认是uefigpt引导模式&#xff0c;且官方没有出usb驱动&#xff0c;…

Ember Charts – 基于 Ember D3 的图表库

Ember Charts 是一个基于 Ember.js 和 D3.js 的图表库。它包括时间序列、柱状图、饼图、点图&#xff0c;很容易扩展和修改。这些图表组件代表图表交互性和演示的最佳实践&#xff0c;是高度可定制和可扩展的。您可以添加说明、标签、提示和鼠标悬停效果。 您可能感兴趣的相关文…

swagger内部类_API管理工具Swagger介绍及Springfox原理分析

swagger是一个API框架&#xff0c;号称世界上最流行的API工具。它提供了API管理的全套解决方案&#xff0c;比如API在线编辑器&#xff0c;API UI展示界面&#xff0c;代码生成器等诸多功能。如果想引入swagger进行API管理。目前 springfox 是一个很好的选择&#xff0c;它内部…

[leetcode-108,109] 将有序数组转换为二叉搜索树

109. 有序链表转换二叉搜索树 Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 给定一个单链表&#xff0c;其中的元素按升序排序&#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平…

c语言大数相加怎么写,大数相加

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include /**** 定义双向节点* 数据区为一个整型数字***/struct Node {int number;//数据区&#xff0c;仅一个数字&#xff0c;保存一位数字struct Node * next;struct Node * prev;};typedef struct Node Node;/*** 创建…

苹果深度学习核心“神经引擎”方向性介绍

https://www.chiphell.com/thread-1785739-1-1.html转载于:https://www.cnblogs.com/eustoma/p/9858410.html

骆驼中的事件处理

在上一篇有关骆驼-小水车的帖子中&#xff0c;我介绍了骆驼-小水车的组件&#xff0c;并使用骆驼路线中的规则实现了一些简单的面向任务的过程。 今天&#xff0c;我将展示如何通过添加事件处理来扩展此示例。 那么如何描述一个事件呢&#xff1f; 每个事件在某个时间发生并持…

值得拥有!精心推荐几款超实用的 CSS 开发工具

当你开发一个网站或 Web 应用程序的时候&#xff0c;有合适的工具&#xff0c;绝对可以帮助您节省大量的时间。在这篇文章中&#xff0c;我为大家收集了超有用的 CSS 开发工具。 对于 Web 开发人员来说&#xff0c;找到有用的 CSS 开发工具&#xff0c;就像找到一个魔灯&#x…