首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 8 - 收集器Collectors_分组groupingBy

如下图所示,分组操作的结果是一个 Map ,把分组函数返回的值作为映射的键,把流中所有具有这个分类值的项目的列表作为对应的映射值。 ?...要实现多级分组,我们可以使用一个由双参数版本的 Collectors.groupingBy 工厂方法创建收集器,它除了普通的分类函数之外,还可以接受 collector 类型的第二个参数。...这意味着 Optional 包装器在这里不是很有用,因为它不会仅仅因为它是归约收集器的返回类型表达一个最终可能不存在却意外存在的值。...这个方法接受两个参数: 一个函数对流中的元素做变换 另一个则将变换的结果对象收集起来 其目的是在累加之前对每个输入元素应用一个映射函数,这样就可以让接受特定类型元素的收集器适应不同类型的对象。...方法的转换函数将 Dish 映射成了它的CaloricLevel :生成的 CaloricLevel 流传递给一个 toSet 收集器,它和 toList 类似,不过是把流中的元素映射到一个 Set 不是

4.1K41
您找到你想要的搜索结果了吗?
是的
没有找到

java8 函数式编程 收集器浅析 收集器Collector常用方法 运行原理 内部实现

用于归约计算(通常用作下游收集器,比如用于  groupingBy 或者partitioningBy 下游) partitioningBy(...)...super T> comparator) 最小值 mapping(Function, Collector) 将提供的映射函数应用于每个元素,并使用指定的下游收集器(通常用作下游收集器本身,比如用于...joining() 假设元素为  String 类型,将这些元素联结到一个字符串中(或许使用分隔符、前缀和后缀)。 counting() 计算元素数量。(通常用作下游收集器。)...super T>) 平均数     (还有  long 和  double 版本) 收集器参数列表 toList() toSet() toCollection(Supplier) counting...调用Collectors 提供的一些Collector  或者你自己定义的 你还可以使用Stream中 ? 直接传递参数,显然并不是很直观 建议能不用就别用了

1.1K20

Java8的Stream流 _ JavaCoreII

使用流,我们可以说明想要完成什么任务,不是说明如何去实现它。我们讲操作的具体调度留给具体实现去解决。 从迭代到流的操作 迭代遍历元素,并在每个元素上执行某项操作。...如何使用Optional值 关键:它在值不存在的情况下会产生一个可替代物,只有在值存在的情况下才会使用这个值。...下游收集器 groupingBy方法会产生一个映射表,它的每个值都是一个列表。如果想要处理这些列表,需要提供一个“下游收集器”。...如果收集操作是并行的,那么就不能直接将元素放到单个BitSet中,因为BitSet对象不是线程安全的。...这些类与Optional类类似,但是具有getAsInt、getAsLong、getAsDouble不是get方法。

91240

Java8-Collect收集Stream

后面自定义收集器会学习具体用法。 自定义归约reducing 前面几个都是reducing工厂方法定义的归约过程的特殊情况,其实可以用Collectors.reducing创建收集器。...这是因为没有初始值,第一个参数有可能是null,当Stream的元素是null的时候,返回Optional就很意义了。 再看参数列表,只剩下BinaryOperator。...Java8则提供了函数式解法。 比如,将dish按照type分组。和前面的toMap类似,但分组的value却不是一个dish,而是一个List。...::getCalories))); 然而常常和groupingBy联合使用的另一个收集器是mapping方法生成的。...这个方法接收两个参数:一个函数对流中的元素做变换,另一个则将变换的结果对象收集起来。其目的是在累加之前对每个输入元素应用一个映射函数,这样就可以让接收特定类型元素的收集器适应不同类型的对象

2.5K50

强大的 Stream 函数式编程

","", "jkl"); // 一定要记住, sorted 只是创建一个流对象排序的视图, 不会改变原来集合中元素的顺序。...Collectors 收集器静态方法 ? Collectors 收集器静态方法 数值流的使用 在 Stream 里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱。...将对象映射为数值流 // 将对象映射为数值流 IntStream intStream = persons .stream() .mapToInt(Person::getAge...数值特化流的终端操作会返回一个 OptinalXXX 对象不是数值。...flatMap 方法的效果是,各个数组并不是分别映射一个流,而是映射成流的内容,所有使用 map(Array::stream)时生成的单个流被合并起来,即扁平化为一个流。

2.7K70

Java 编程问题:九、函数式编程——深入研究

分组:编写用于处理groupingBy()收集器的代码片段。 分区:编写几个代码片段,用于使用partitioningBy()收集器。...这个映射最好按键排序,所以默认的HashMap不是很有用。如果我们可以指定一个TreeMap不是默认的HashMap,那么问题就解决了。...但是我们怎样才能将Stream划分成一组List,每个列表只包含瓜的类型,不是Melon实例? 嗯,转化一个流的元素通常是map()的工作。...首先,让我们说编写自定义收集器不是一项日常任务,但是知道如何做可能会很有用。...方法引用主要是一种通过名称不是通过描述如何调用方法来调用方法的技术。主要的好处是可读性。 方法引用是通过将目标引用放在分隔符::之前来编写的,方法的名称在它之后提供。

1.5K10

Java Stream 解析和使用技巧

通常在三种情况下collect()的结果会是Map: 使用Collectors.toMap()生成的收集器,用户需要指定如何生成Map的key和value。...使用Collectors.partitioningBy()生成的收集器,对元素进行二分区操作时用到。 使用Collectors.groupingBy()生成的收集器,对元素做group操作时用到。...还有更狠的,下游收集器还可以包含更下游的收集器,这绝不是为了炫技增加的把戏,而是实际场景需要。...考虑将员工按照部门分组的场景,如果我们想得到每个员工的名字(字符串),不是一个个_Employee对象_,可通过如下方式做到: // 按照部门对员工分布组,并只保留员工的名字 Map<Department...不是一步一步迭代实现,这样最大的弊端是没有办法应对复杂的数据结构。

47720

讲透JAVA Stream的collect用法与原理,远比你想象的更强大

,提供了很多Collector接口的具体实现类,是为了方便程序员使用预置的一些较为通用的收集器(如果不使用Collectors类,而是自己去实现Collector接口,也可以)。...为了方便使用,在Collectors工具类中,提供了两个groupingBy重载实现,其中有一个方法只需要传入一个分组函数即可,这是因为其默认使用了toList()作为值收集器: 例如:仅仅是做一个常规的数据分组操作时...Collectors.groupingBy()分组收集器使用方式相同。...Collector收集器,这几个接口之间是如何配合处理并将Stream数据收集为需要的输出结果的呢?...因为我们实现的收集器是允许并行流中使用的,所以我们声明了CONCURRENT属性;作为一个数字累加算总和的操作,对元素的先后计算顺序并没有关系,所以我们也同时声明UNORDERED属性;但是因为我们的

1.8K11

Java 8中的Lambda 和 Stream (from Effective Java 第三版)

这是我们在第 45 项中的 Anagram 程序中使用收集器,用于生成从按字母顺序排列的单词到共享字母顺序的单词列表映射: words.collect(groupingBy(word -> alphabetize...(word)))   如果希望 groupingBy 返回一个生成带有除列表之外的值的映射收集器,则除了分类器之外,还可以指定下游收集器(downstream collector)。...下游收集器从一个包含类别中所有元素的流中生成一个值。此参数的最简单用法是传递 toSet(),这将生成一个映射,其值是元素集不是列表。...这会生成一个映射,该映射将每个类别与类别中的元素数相关联,不是包含元素的集合。...终端操作 forEach 仅应用于报告流执行的计算结果,不是用于执行计算。为了正确使用流,你必须了解收集器

2.3K10

(93) 函数式数据处理 (下) 计算机程序的思维逻辑

如何使用?基本原理是什么?本节进行详细讨论,我们先来进一步理解下collect方法。...实践中,经常需要将一个对象列表按主键转换为一个Map,以便以后按照主键进行快速查找,比如,假定Student的主键是id,希望转换学生流为学生id和学生对象的Map,代码可以为: Map<String,...对最通用的groupingBy函数返回的收集器,其收集元素的基本过程和伪代码为: //先创建一个存放结果的Map Map map = mapFactory.get(); for (T t : data)...Student::getGrade, maxBy(Comparator.comparing(Student::getScore)))); 需要说明的是,这个分组收集结果是Optional,不是...和partitioningBy都可以接受一个下游收集器下游收集器又可以是分组或分区。

1.2K80

Java 8 - 收集器Collectors

我们来看下不是用流,是如何处理的 ? 如果用流呢? ?...(Transaction::getCurrency)); 这个例子清晰的展示了函数式编程相对于指令式编程的一个主要优势:只需指出希望的结果—“做什么”,不用操心执行的步骤——“如何做” 。...我们之前接触的toList 只是说“按顺序给每个元素生成一个列表”; groupingBy 说的是“生成一个Map ,它的键是(货币)桶,值则是桶中那些元素的列表”。...Collector 接口中方法的实现决定了如何对流执行归约操作。但 Collectors 实用类提供了很多静态工厂方法,可以方便地创建常见收集器的实例,只要拿来用就可以了。...(Collectors.toList()); ---- 预定义收集器 预定义收集器的功能,也就是那些可以从 Collectors类提供的工厂方法(例如 groupingBy创建收集器

73120

Java8InAction

在下面的代码中,我们向你展示如何利用它来创建一个map方法,以将一个String列表映射到包含每个String长度的Integer列表。...这个函数会被应用到每个元素上,并将其映射成一个新的元素(使用映射一词,是因为它和转换类似,但其中的细微差别在于它是“创建一个新版本”不是去“修改”)。...flatMap方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。...6.3.2 按子组收集数据 但进一步说,传递给第一个groupingBy的第二个收集器可以是任何类型,不一定是另一个groupingBy。...10.3.1 创建Optional对象 使用Optional之前,你首先需要学习的是如何创建Optional对象。完成这一任务有多种方法。

1.2K50

Java函数式编程Stream.collect()为什么这么受欢迎?

通常在三种情况下collect()的结果会是Map: 使用Collectors.toMap()生成的收集器,用户需要指定如何生成Map的key和value。...使用Collectors.partitioningBy()生成的收集器,对元素进行二分区操作时用到。 使用Collectors.groupingBy()生成的收集器,对元素做group操作时用到。...情况3:使用groupingBy()生成的收集器,这是比较灵活的一种情况。...还有更狠的,下游收集器还可以包含更下游的收集器,这绝不是为了炫技增加的把戏,而是实际场景需要。...考虑将员工按照部门分组的场景,如果我们想得到每个员工的名字(字符串),不是一个个Employee对象,可通过如下方式做到: 使用collect()做字符串join 这个肯定是大家喜闻乐见的功能,字符串拼接时使用

1K50

Java核心技术卷2 高级特性 学习笔记(1)

通过使用流,我们可以说明想要完成什么任务,不是说明如何去实现它。将操作的调度留给具体实现去做。 流遵循了做什么而非怎么做的原则。...extends K> classifier) // 产生一个收集器,它会产生一个映射表,其键是true/false,值是由满足/不满足断言的元素构成的列表 static Collector predicate) groupingBy方法会产生一个映射表,它的每个值都是一个列表,如果想要以某种方式来处理这些列表,就需要提供一个下游收集器。...例如,如果想要获得集不是列表,那么可以用Collector.toSet收集器。 // 产生一个可以对收集到的元素进行计数的收集器 static Collector comparator) //产生一个收集器,它会产生一个映射表,其键是将mapper应用到收集到的数据上产生的,其值是使用downstream收集器收集到具有相同键的元素 static

1K20

Java8-Collectors.groupingBy()-JDK源码分析

这是groupingBy方法的第二个重载版本,其输入参数有分类器实例classifier,下流收集器实例downstream,其实际上调用了 CodeBlock-3: 中的第三个重载版本,所以具体如何实现的我们放到...BiConsumer, T> accumulator = (m, t) -> { //不加任何前缀的accumulator接口实现对象是指整个groupingBy方法返回的收集器的...M castResult = (M) intermediate; //这所以要强制类型砖转换,这是因为分组方法的总体返回是M extends Map,不是...对每个元素使用classifier(Function)找到当前元素所对应的键值,用于分类 1)....A:downstrream下流收集器对象的中间结果容器 M:M extends Map,其为整个分类方法的中间结果容器 源码中接重要收集器接口对象的作用说明: 1)classifier提供一个接口实现

1.2K20

Java 8 新特性(二)流类库

有时候需要将多个流的结果合并为一个流,这时候需要使用平整映射。...听起来是不是有点奇怪,实际上,接受的是这些方法的返回值。例如toList()方法实际上是这样的,返回的是Collector对象,然后由collect方法处理,获取最后的集合。...如果需要使用特定的集合,可以使用toCollection方法,它的参数是一个比较特殊的函数接口,用于创建集合。所以这里可以直接使用构造方法引用来创建集合。...如果问题比较复杂,还可以将多个收集器组合起来使用,一些收集器有重载的版本,支持第二个收集器,可以用来实现这个功能。...groupingBy的第二个参数可以使用mapping收集器,mapping这里的作用和流操作的map类似,将流再次进行映射,然后收集结果作为最后Map的键值对。

89160

Java 8 Stream常用方法学习

以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。...也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。 相关名词 描述 元素 对象形成的一个队列。...Stream的特点: Stream不是什么数据结构,它不会保存数据,只是将操作的数据结果保存到另一个对象中。...但map接收的是一个Function表达式,有返回值;peek接收的是Consumer表达式,是没有返回值的。...创建流的两种方式 创建流的方式 描述 stream 为集合创建串行流 parallelStream 为集合创建并行流 parallelStream里面的执行是异步的,并且使用的线程池是 ForkJoinPool.common

1.1K20
领券