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

java 8 集合分组

java 8 集合分组_Java 8:按集合分组相关推荐

  1. java+实现集合并运算_JAVA程序设计报告+集合运算

    JAVA程序设计报告+集合运算 JAVA程序设计报告集合的运算(交并差)学生学号专业信息工程(系统工程方向)院系信息与控制学院实习时间三周:指导老师陈金辉目录实验目的试验设计实验源程序程序设计调试不足 ...

  2. java中的集合框架_JAVA中的集合框架(上)List

    第一节 JAVA中的集合框架概述 集合的概念,现实生活中:很多事物凑在一起就是一个集合:数学中的集合:具有相同属性事物的总体:JAVA中的集合:是一种工具类,就像是容器,储存任意数量的具有共同属性的对 ...

  3. java对list分组_Java List排序,分组等操作

    假定有一列实体类对像 List list = UserServer.getList(); 去重,去除重复对象(每个属性的值都一样的),需要注意的是要先重写对象User的equals和hashCode方 ...

  4. java 集合分组_java List 如何进行分组

    第四步:双字段分组. 1.此处依然使用了jdk1.8的新特性(转set时),也可以自己写两个for循环替代. 2.实体类使用的还是Student 3.设计思路就是先将要分组的两个字段分别转为set集合 ...

  5. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)

    这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母. 支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下 传统的 : List list = new ArrayLi ...

  6. java list《》_Java中List集合的遍历

    一.对List的遍历有三种方式 List    list    =    new    ArrayList(); list.add("testone"); list.add(&qu ...

  7. java 数组长度 可变_java基础之集合长度可变的实现原理

    首先我们要明白java中的集合Collection,List,ArrayList之间的关系: ArrayList是具体的实现类,实现了List接口 List是接口,继承了Collection接口 Li ...

  8. java 分批同时处理_java中List集合分批处理

    在项目中存在list集合数据量过大,需要对这个list集合进行分批处理,自己写了一个list分批处理的一个算法: package com.lv.huizhong.demo; import java.u ...

  9. java 集合迭代器_Java中的集合迭代器

    集合的迭代器 任何集合都有迭代器. 任何集合类,都必须能以某种方式存取元素,否则这个集合容器就没有任何意义. 迭代器,也是一种模式(也叫迭代器模式).在java中它是一个对象,其目的是遍历并选中其中的 ...

  10. java中怎么让原有的集合反转_Java如何反转集合中的元素?

    在Java编程中,如何反转集合中的元素? 下面的例子演示了如何使用CollectionIlator()和Collection.List()的Collection.reverse()方法来反转集合. p ...

最新文章

  1. iOS 系统版本判断
  2. UVa1153 Keep The Customer Satisfied(贪心)
  3. html 如何判断文本溢出,判断文本是否溢出
  4. m227fdw恢复出厂设置_惠普M227fdw使用说明
  5. boost::fusion::traits用法的测试程序
  6. Verilog UDP(User Defined Primitives)
  7. 2000年考研英语阅读理解文章三
  8. Sublime 的中文乱码问题
  9. Onvif2.6.1命名空间前缀对照
  10. 在Linux中使用cURL进行HTTP POST和GET [复制]
  11. PID调控公式和相关方法
  12. Visual C++鼠标画线操作
  13. ae合成设置快捷键_AE设计首选快捷键大全+解析
  14. Git 常用记录(删除commit操作/挑拣/删除仓库)
  15. 2019第三季度UWA STAR:解答亦是学习
  16. Python中的easy_install安装
  17. AlphaZero登上Science封面:从小白开始制霸多个游戏
  18. 不懂怎么搞定人的进来:年业绩千万的老销售给你几招实惠的-没有干货立即跳楼
  19. 利好:加快发展统一的资本市场
  20. YTU OJ 3094: 善良的小乌龟

热门文章

  1. 【DP】【记忆化搜索】NIKOLA(jzoj 1150)
  2. 【DP】花店橱窗布置 (ssl 1626/luogu 1854)
  3. Uva12325 Zombie's Treasure Chest [二分区间+模拟退火]
  4. Zookeeper一致性协议原理Zab
  5. 常用公有云接入——AZURE
  6. Javafx的WebEngine的url加载不输出结果坑,gc回收了局部变量
  7. 使用Docker 实现微服务并搭建博客,一文全掌握
  8. JS实现星星评分功能实例代码(两种方法)
  9. Java多线程sleep和wait的区别,总结得非常好
  10. JavaFX之TableView的TableRow