本文记录collect的高级用法。
依然先准备测试数据
class Item implements Comparable<Item> { public String id; public int count; public Item(String id, int count) { this.id = id; this.count = count; } @Override public int compareTo(Item o) { return count - o.count; } @Override public String toString() { return String.format("(%s, %d)", id, count); } }
Item item1 = new Item("it1", 1); Item item2 = new Item("it2", 3); Item item3 = new Item("it3", 2); Item item4 = new Item("it4", -1); List<Item> list = new ArrayList<>(); list.add(item1); list.add(item2); list.add(item3); list.add(item4);
1. 转化成其他类型的集合
例如 toSet(),toList(),也可以限定具体的类型:
Set<Item> set = list.stream().collect(Collectors.toCollection(TreeSet::new));
如果Item没有实现Comparable, refer Using streams to collect into TreeSet with custom comparator
2. 转化成一个value
例如minBy,maxBy,averagingInt等
Optional<Item> res = list.stream() .collect(Collectors.minBy( Comparator.comparingInt(item -> item.count)));
double aver = list.stream().collect(Collectors.averagingInt(item -> item.count));
对于string类型的可以通过join连接
String join = list.stream() .map(item -> item.id) .collect(Collectors.joining(",", "[", "]")); //返回[it1,it2,it3,it4]
3. 分割 -- 根据判断结果分成两组
Map<Boolean, List<Item>> map = list.stream() .collect(Collectors.partitioningBy(item -> item.count > 1)); // {false=[(it1, 1), (it4, -1)], true=[(it2, 3), (it3, 2)]}
4. 分组 -- 和SQL中的groupby类似
可以实现分割的功能,为了突出效果,可以将item2的count值设置为2,然后按照count进行分组
Map<Integer, List<Item>> map = list.stream() .collect(Collectors.groupingBy(item -> item.count)); // {-1=[(it4, -1)], 1=[(it1, 1)], 2=[(it2, 2), (it3, 2)]}
5. 组合使用
比较多的在groupingBy中使用
比如求count相同的item个数
Map<Integer, Long> countMap = list.stream() .collect(Collectors.groupingBy( item -> item.count, Collectors.counting())); // {-1=1, 1=1, 2=2}
比如按count分组,结果以字符串的形式连接
Map<Integer, String> strMap = list.stream() .collect(Collectors.groupingBy( item -> item.count, Collectors.mapping(it -> it.id, Collectors.joining(",", "[", "]")))); // {-1=[it4], 1=[it1], 2=[it2,it3]}
其实就是分组完成后,对每个list进行二次操作
关于自定义collector的话题,这边不cover了。
相关推荐
Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...
Java 8 引入的 Lambda 表达式是 Java 编程语言的重大变革之一,它允许以更简洁的方式表示单方法接口的实现,极大地增强了 Java 语言的表达能力,尤其是结合了函数式接口、Stream API 和其他新特性后。接下来,我们将...
根据给定文件信息,内容主要围绕Java中Lambda表达式对集合进行操作,以下是详细的知识点: 1. Lambda表达式基础: Lambda表达式是Java 8引入的一种简洁的表示可传递的匿名函数的方式。它允许我们将函数作为参数传递...
Java 8引入了Lambda表达式,这是一种简洁的编写代码的方式,可以将代码块作为参数传递给方法,或者作为赋值给变量的对象。Lambda表达式为Java增加了函数式编程的能力,使代码更加简洁和灵活。在Java 8中,Lambda...
Lambda表达式在Java中被设计为一种匿名函数,可以没有名称地传递,并且可以当作参数或返回值。这种特性在处理高阶函数时特别有用,例如在集合API的流(Stream API)操作中。 **语言篇:** 1. **定义与语法**: Java...
总的来说,Lambda 表达式是 Java 8 的核心特性之一,它改变了我们编写代码的方式,使得函数式编程思想更好地融入到 Java 语言中。通过 Lambda 表达式、Stream API、新的日期时间API以及内存模型的改进,Java 8 提升...
Stream API是Java 8引入的用于处理集合的新特性,Lambda表达式与之配合使用,能实现复杂的数据处理任务。例如,`list.stream().filter(s -> s.startsWith("A")).map(String::toUpperCase).collect(Collectors.toList...
Lambda表达式常用于集合操作,如`filter()`, `map()`, `reduce()`, `collect()`等。例如,筛选出长度大于3的字符串: ```java list.stream() .filter(s -> s.length() > 3) .forEach(System.out::println); ``...
例如,`(int x, int y) -> x + y` 是一个接受两个整数参数并返回它们之和的Lambda表达式。参数列表在括号内,箭头符号“->”分隔参数和函数体。如果函数体只有一条语句,那么可以省略花括号。如果参数类型可以推断,...
【Java8】Lambda表达式 和 Stream API 是Java编程语言中的两个重要创新,它们极大地提升了代码的简洁性和可读性,特别是在处理集合数据时。这里我们将深入探讨这两个特性,并结合实际示例来理解它们的工作原理。 ...
Java Lambda表达式是Java编程语言的一个重要特性,自Java 8开始引入,它极大地简化了函数式编程,尤其是在处理集合和并发操作时。Lambda表达式的主要...理解和熟练使用Lambda表达式是现代Java开发者的必备技能之一。
### Java:解锁Lambda表达式的魔法—从零开始的函数式编程之旅 #### 一、Lambda表达式:Java中的函数式编程基石 Lambda表达式是Java 8引入的一个重要特性,它为Java带来了函数式编程的能力。在此之前,Java一直被...
### Java 8 中 Lambda 表达式的全解析 #### 引言 Java 8 自发布以来,便成为了 Java 发展史上的一大里程碑。这次版本更新带来了众多重要的新特性,其中最引人注目的当属 Lambda 表达式。这一功能不仅为 Java ...
Java 1.8引入了lambda表达式,这是Java语言的一项重大改进,显著提升了代码的简洁性和可读性,尤其在处理函数式编程场景时。Lambda表达式是Java 8对函数式接口支持的核心组成部分,它允许我们将代码块视为一种值,...
Java 8 是一个重要的 Java 发行版本,引入了许多新特性,其中最显著的就是 Lambda 表达式。Lambda 表达式极大地简化了函数式编程,让 Java 更加简洁、高效。下面将详细介绍如何在 Java 8 中使用 Lambda 表达式。 ##...
### Java Lambda表达式详解 #### 引言 随着软件开发技术的发展,编程语言也在不断进步以适应更高的效率和更简洁的编码风格。Java作为一种广泛应用于企业级应用开发的语言,在其第八版更新中引入了许多令人期待的新...
### 使用Java Lambda表达式实现一个简单的用户管理系统 #### 背景介绍 Lambda表达式是Java 8引入的一项重要特性,它允许开发者以简洁、直观的方式编写匿名函数。这一特性极大地提高了代码的可读性和可维护性,尤其...
Java 8 的 Lambda 表达式是 Java 语言的一个重大更新,它引入了一种新的编程范式,使得函数式编程在 Java 中变得更为简洁和高效。Lambda 表达式允许我们将函数作为一个对象来处理,这在处理集合、事件驱动、多线程等...
类型推导是指编译器负责推导 lambda 表达式的类型,它利用 lambda 表达式所在上下文所期待的类型进行推导。方法引用是指 lambda 表达式允许我们定义一个匿名方法,并允许我们以函数式接口的方式使用它。函数式编程是...