= dishes.stream().map(Dish::getName).collect(toList()); 将原来的Stream映射为一个单元素流,然后收集为List。...根据情况选择最佳方案 上面的demo说明,函数式编程通常提供了多种方法来执行同一个操作,使用收集器collect比直接使用stream的api用起来更加复杂,好处是collect能提供更高水平的抽象和概括...() .collect(groupingBy(this::getCaloricLevel)); 多级分组 groupingBy还重载了其他几个方法,比如 public static 多级分组 Map>> byTypeAndCalory = dishes.stream().collect( groupingBy...::getCalories))); 然而常常和groupingBy联合使用的另一个收集器是mapping方法生成的。
收集器简介 收集器用来将经过筛选、映射的流进行最后的整理,可以使得最后的结果以不同的形式展现。 collect方法即为收集器,它接收Collector接口的实现作为具体收集器的收集方法。...2.1.1 计数 long count = list.stream() .collect(Collectors.counting()); 也可以不使用收集器的计数函数...Collectors.reducing方法还提供了一个单参数的重载形式。 你只需传一个归约的操作过程给该方法即可(即第三个参数),其他两个参数均使用默认值。...2.2.2 多级分组 多级分组可以支持在完成一次分组后,分别对每个小组再进行分组。 使用具有两个参数的groupingby重载方法即可实现多级分组。...此外,partitioningBy方法和groupingBy方法一样,也可以接收第二个参数,实现二级分区或对分区结果进行统计。
上面介绍的方法在编程上更方便快捷,但reducing的可读性更高,实际使用哪种我觉得还是看个人喜好。...举个使用reducing求最大值的例子: list.stream().collect(reducing(0, Dish::getCalories, Integer::max)); // 800 或者:...list.stream().map(Dish::getCalories).collect(reducing(0, Integer::max)); // 800 分组 分组功能类似于SQL里的group...多级分组 Collectors.groupingBy支持嵌套实现多级分组,比如将食材按照类型分类,然后再按照卡路里的高低分类: MapgroupingBy组合使用的方法还有Collectors.mapping。
Map> collect = menu.stream().collect(groupingBy(Dish::getType)); 用 Collectors.groupingBy...要实现多级分组,我们可以使用一个由双参数版本的 Collectors.groupingBy 工厂方法创建的收集器,它除了普通的分类函数之外,还可以接受 collector 类型的第二个参数。...最后,第二级 map 的值是流中元素构成的 List ,是分别应用第一级和第二级分类函数所得到的对应第一级和第二级键的值:“salmon、pizza…” 这种多级分组操作可以扩展至任意层级,n级分组就会得到一个代表...::getCalories))); 返回 {MEAT=1900, FISH=750, OTHER=1550} 然而常常和 groupingBy 联合使用的另一个收集器是 mapping 方法生成的。...方法的转换函数将 Dish 映射成了它的CaloricLevel :生成的 CaloricLevel 流传递给一个 toSet 收集器,它和 toList 类似,不过是把流中的元素映射到一个 Set 而不是
在看代码的时候看到了相关方法,自己在写了个例子练习一下 public class People { private Integer id; private String name...; add(people4); add(people5); add(people6); add(people7); add(people8); }}; System.out.println(list.stream...().filter(People::getSex).collect(Collectors.toList())); //[People{id=1, name='Ligs', sex=true}, People...System.out.println(list.stream().map(People::getSex).collect(Collectors.toList())); //[true, false,...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
下面的例子将每个字符串转换成大写的字符串。但你也可以使用map将每个对象转换为另一种类型。最终输出的结果类型依赖于你传入的函数表达式。...如果涉及到一对多映射,需要将映射结果放入Stream中。...使用flatMap方法的效果是,转换后的多个结果并不是分别映射成一个流,而是映射成流的内容。...(", ")); // 按性别分组Map> maps = studentList.stream().collect(Collectors.groupingBy...第三个:累积函数int sum = studentList.stream().collect(Collectors.reducing(0, Student::getAge, Integer::sum))
大家好,又见面了,我是你们的朋友全栈君。 Stream流 collect() 方法的使用介绍 //1....对 Stream流 的收集还有其他的方法。比如说:聚合计算,分组,多级分组,分区,拼接等。...Stream流的map()和reduce()方法亦可求和) //map()和reduce()方法实现 //Integer reduce = studentStream.map...//1.先根据年龄分组,然后再根据成绩分组 //分析:第一个Collectors.groupingBy() 使用的是(年龄+成绩)两个维度分组,所以使用两个参数 groupingBy...分组和分区的区别就在:分组可以有多个组。分区只会有两个区( true 和 false) //1.一个参数 partitioningBy(Predicate<?
API 使用 Stream 的 collect 方法中的转换为熟悉的集合容器。...用法和 groupingBy 差不多。...(byHeight)))); 结合最开始给的例子你可以使用 reducing 找出最长的字符串试试。...还有些情况,我们想在 reducing 的时候把 Person 的身高先四舍五入一下。这就需要我们做一个映射处理。定义一个 Functionstream() .collect(Collectors.groupingBy(Person::getCity, Collectors.reducing
skip(n)跳过操作,跳过前n个元素的流,如果元素为空,则返回一个空流。 3.2.2 映射 map(T->R)映射操作,将流中的每一个元素映射成一个新元素,转换成另一个对象。...")); System.out.println(collect5); 4.2 reducing也能做这些事儿 除了使用现成的一些收集器方法之外,Collectors.reducing也能做到归约和汇总...System.out.println(collect11); 还可以实现多级分组,通过groupingBy中的另一个参数可以选择二级分组的规则,并且最终会嵌套在一级分组之内 final Map<Book.Type...); partitioningBy同样也可以和groupingBy配合一起使用,通过groupingBy收集器会在Boolean作为key的Map中继续生成一个二级map //{false={MATH=...(toList(),List::size)); 转换函数返回的类型 包裹另一个收集器,对其结果应用转换函数 groupingBy使用示例:Map> BookesByType = menuStream.collect
结果: 求和结果: 514905 平均值为: 514.905 在需要同时获取流中元素的个数,求和,平均值,最大值,最小值时,可使用收集器XxxSummaryStatistics。...自定义规约操作:广义上的规约汇总 Collectors.reducing(U identity, Function的函数) 观察源码发现,我们使用最多的接收一个参数的groupingBy()方法其实: public static Collector的Map的keys只有true和false。...欢迎在评论区留下你看文章时的思考,及时说出,有助于加深记忆和理解,还能和像你一样也喜欢这个话题的读者相遇~
实战读书笔记:数值流、Stream创建与Optional类的使用 java8读书笔记:探究java8流收集数据原理 本文将从Collectos中构建收集器入手,详细介绍java8提供了哪些收集器,重点介绍...:toList、toSet、toCollection、joining、groupBy(包含多级分组)、reducing的核心实现原理与使用示例。...= menu.stream().map(Dish::getName) 3 .collect(Collectors.toList()); 4} 由于toList...groupingBy的原理就讲解到这里,我们接下来思考如下场景: 还是上面的购物车场景,现在要求先按照供应商名称分组,然后按照购买人分组(即多级分组),类似于SQL group by sellerId,...关于Collectors.reducing,建议可以直接使用Stream自身提供的reducing方法,具体请参考博文:java8实战读书笔记:初识Stream、流的基本操作(流计算)
以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。...也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。 相关名词 描述 元素 对象形成的一个队列。...和一个不满足条件的Map。...Boolean, Map>> groupingBy2 = intList.stream().collect(Collectors.groupingBy(i...,该函数会被应用到每个元素上,并将其映射成一个新的元素。
如果你发现自己一直都是这样使用 groupingBy()收集器: .collect(groupingBy(...)); 或者,如果你只是想看看 groupingBy()还有什么神乎其技的用法,那么这篇文章就是为你准备的...分组和计算各组的和 如果你想对集合内的元素求和,这里也有一些可用的收集器: summingInt() summingLong() summingDouble() 这些收集器的使用示例如下所示: List...分组和归约 如果您想对分组的元素执行归约操作,可以使用 reducing()收集器: groupingBy(List::size, reducing(List.of(), (l1, l2) -> ......> result = strings.stream() .map(toStringList()) .collect(groupingBy(List::size, reducing...不过,我们可以使用 reducing()收集器来实现要想的功能。 组合下游收集器 一旦我们开始组合多个收集器来定义复杂的下游分组操作,就可以发挥收集器的全部能力了。
Collector常见用法 常用形式为: .collect(Collectors.toList()) collect()是Stream的方法 Collectors 是收集器Collector...super T> comparator) 最小值 mapping(Function, Collector) 将提供的映射函数应用于每个元素,并使用指定的下游收集器(通常用作下游收集器本身,比如用于...Map> byDept = employees.stream() .collect(Collectors.groupingBy(Employee:...:getDepartment)); // 计算部门薪资和 Map totalByDept = employees.stream() .collect(Collectors.groupingBy...调用Collectors 提供的一些Collector 或者你自己定义的 你还可以使用Stream中 ? 直接传递参数,显然并不是很直观 建议能不用就别用了
相反,Stream API 使用内部 迭代——它帮你把迭代做了) @Test public void test1(){ boolean b1=employees.stream...返回 Optional 备注:map 和 reduce 的连接通常称为 map-reduce 模式,因 Google 用它 来进行网络搜索而出名 /* * 归约 * reduce...(Employee::getSalary))); reducing 归约产生的类型 从一个作为累加器的初始值 开始,利用BinaryOperator与 流中元素逐个结合,从而归 约成单个值 inttotal...=list.stream().collect(Collectors.reducing(0, Employee::getSalar, Integer inttotal=list.stream().collect...)); /* * 收集 * collect-将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法。
比如,求这几个人的体重平均值,因为体重是Double类型,所以在不转换类型的情况下,需要使用averagingDouble :people.stream().collect(Collectors.averagingDouble...比如,得到所有Person的 Id 列表,只需要根据需要的结果类型使用不同的方法即可:people.stream().map(Person::getId).collect(Collectors.toList...分组:partitioningBypartitioningBy与groupingBy的区别在于,partitioningBy借助Predicate断言,可以将集合元素分为true和false两部分。...().map(Person::getWeight).reduce(0.0,Double::sum);// 332.26maxBy和minBy这两个函数就是通过reducing实现的。...mapping和reducing,可以参考map-reduce的概念。很多框架都是用的map-reduce方式进行操作和聚合。七、工作中常用的一些组合操作:1.
其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。...)) < 0) .collect(Collectors.counting()); 最后一种统计元素个数的方法在与collect联合使用的时候特别有用 查找 findFirst查找第一个 Optional...(Invoice::getType)); 在collect方法中传入groupingBy进行分组,其中groupingBy的方法参数为分类函数。...还可以通过嵌套使用groupingBy进行多级分类 Map>> = invoiceList.stream().collect(Collectors.groupingBy...同时使用的时候注意不要将声明式和命令式编程混合使用。
= list.stream().collect(Collectors.groupingBy(e -> fetchGroupKey(e))); //{zhangsan#beijing=[User{age...= list.stream().collect( Collectors.groupingBy( User::getAddress, Collectors.groupingBy(User::getName...使用Arrays.asList 我有一个与Web访问记录相关的域对象列表。这些域对象可以扩展到数千个。...(WebRecord::getTxnTime, Collectors.reducing(0, WebRecord::getReqBytes(), Integer::sum))))))); 这是可行的,但它是丑陋的...有谁知道更好的方法吗?任何帮助都将不胜感激。 我想知道是否有更好的方法来展开嵌套的映射,或者是否有一个库允许您对集合进行分组。 最佳答案 您应该为地图创建自定义密钥。
= list.stream().collect(Collectors.groupingBy(e -> fetchGroupKey(e))); //{zhangsan#beijing=[User...= list.stream().collect( Collectors.groupingBy( User...使用Arrays.asList 我有一个与Web访问记录相关的域对象列表。这些域对象可以扩展到数千个。...如你所见,这是相当混乱和难以维持。 有谁知道更好的方法吗?任何帮助都将不胜感激。 我想知道是否有更好的方法来展开嵌套的映射,或者是否有一个库允许您对集合进行分组。...最简单的方法是使用Arrays.asList: Function> keyExtractor = wr -> Arrays.
map方法示意图: [1240] 4、flatMap 映射 flatMap映射和map映射类似,不过它的每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中,说白了就是将几个小的...collect方法的使用较为复杂,这里仅仅介绍一些常用的方法即可。...); System.out.println(integerOne); //20 //方法三,使用stream流的reducing方法...Integer integerTwo = integerList.stream().collect( Collectors.reducing(0,x->x+1,(sum,...,但是我觉得这是做了第一步如何使用它,后续会出一些文章来好好研究里面的源码,同时会对上面的一些方法进行更深层次的研究和使用。
领取专属 10元无门槛券
手把手带您无忧上云