`
xuanzhui
  • 浏览: 200849 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Lambda表达式之collect

    博客分类:
  • Java
阅读更多

本文记录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了。

 

 

 

 

分享到:
评论

相关推荐

    java8lambda表达式Demo

    Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...

    jdk1.8 Lambda表达式

    Java 8 引入的 Lambda 表达式是 Java 编程语言的重大变革之一,它允许以更简洁的方式表示单方法接口的实现,极大地增强了 Java 语言的表达能力,尤其是结合了函数式接口、Stream API 和其他新特性后。接下来,我们将...

    Lambda表达式.pdf

    根据给定文件信息,内容主要围绕Java中Lambda表达式对集合进行操作,以下是详细的知识点: 1. Lambda表达式基础: Lambda表达式是Java 8引入的一种简洁的表示可传递的匿名函数的方式。它允许我们将函数作为参数传递...

    Java8的Lambda表达式

    Java 8引入了Lambda表达式,这是一种简洁的编写代码的方式,可以将代码块作为参数传递给方法,或者作为赋值给变量的对象。Lambda表达式为Java增加了函数式编程的能力,使代码更加简洁和灵活。在Java 8中,Lambda...

    java lambda 表达式(语言篇和类库篇)

    Lambda表达式在Java中被设计为一种匿名函数,可以没有名称地传递,并且可以当作参数或返回值。这种特性在处理高阶函数时特别有用,例如在集合API的流(Stream API)操作中。 **语言篇:** 1. **定义与语法**: Java...

    Lambda表达式--凌尘.pptx

    总的来说,Lambda 表达式是 Java 8 的核心特性之一,它改变了我们编写代码的方式,使得函数式编程思想更好地融入到 Java 语言中。通过 Lambda 表达式、Stream API、新的日期时间API以及内存模型的改进,Java 8 提升...

    Lambda表达式学习,总结,速查手册大全.rar

    Stream API是Java 8引入的用于处理集合的新特性,Lambda表达式与之配合使用,能实现复杂的数据处理任务。例如,`list.stream().filter(s -&gt; s.startsWith("A")).map(String::toUpperCase).collect(Collectors.toList...

    Lambda表达式超详细总结

    Lambda表达式常用于集合操作,如`filter()`, `map()`, `reduce()`, `collect()`等。例如,筛选出长度大于3的字符串: ```java list.stream() .filter(s -&gt; s.length() &gt; 3) .forEach(System.out::println); ``...

    Lambda表达式学习教程

    例如,`(int x, int y) -&gt; x + y` 是一个接受两个整数参数并返回它们之和的Lambda表达式。参数列表在括号内,箭头符号“-&gt;”分隔参数和函数体。如果函数体只有一条语句,那么可以省略花括号。如果参数类型可以推断,...

    【Java8】Lambda表达式 和 Stream API 详解笔记.zip

    【Java8】Lambda表达式 和 Stream API 是Java编程语言中的两个重要创新,它们极大地提升了代码的简洁性和可读性,特别是在处理集合数据时。这里我们将深入探讨这两个特性,并结合实际示例来理解它们的工作原理。 ...

    JAVA lambda表达式

    Java Lambda表达式是Java编程语言的一个重要特性,自Java 8开始引入,它极大地简化了函数式编程,尤其是在处理集合和并发操作时。Lambda表达式的主要...理解和熟练使用Lambda表达式是现代Java开发者的必备技能之一。

    Java:解锁Lambda表达式的魔法-从零开始的函数式编程之旅

    ### Java:解锁Lambda表达式的魔法—从零开始的函数式编程之旅 #### 一、Lambda表达式:Java中的函数式编程基石 Lambda表达式是Java 8引入的一个重要特性,它为Java带来了函数式编程的能力。在此之前,Java一直被...

    探索Java 8的新世界:Lambda表达式全解析

    ### Java 8 中 Lambda 表达式的全解析 #### 引言 Java 8 自发布以来,便成为了 Java 发展史上的一大里程碑。这次版本更新带来了众多重要的新特性,其中最引人注目的当属 Lambda 表达式。这一功能不仅为 Java ...

    Java 1.8 lambda表达式示例源码

    Java 1.8引入了lambda表达式,这是Java语言的一项重大改进,显著提升了代码的简洁性和可读性,尤其在处理函数式编程场景时。Lambda表达式是Java 8对函数式接口支持的核心组成部分,它允许我们将代码块视为一种值,...

    java8手把手教你学会写lambda表达式

    Java 8 是一个重要的 Java 发行版本,引入了许多新特性,其中最显著的就是 Lambda 表达式。Lambda 表达式极大地简化了函数式编程,让 Java 更加简洁、高效。下面将详细介绍如何在 Java 8 中使用 Lambda 表达式。 ##...

    Java Lambda表达式:简化代码与增强表达力的利器

    ### Java Lambda表达式详解 #### 引言 随着软件开发技术的发展,编程语言也在不断进步以适应更高的效率和更简洁的编码风格。Java作为一种广泛应用于企业级应用开发的语言,在其第八版更新中引入了许多令人期待的新...

    使用Java Lambda表达式实现一个简单的用户管理系统.txt

    ### 使用Java Lambda表达式实现一个简单的用户管理系统 #### 背景介绍 Lambda表达式是Java 8引入的一项重要特性,它允许开发者以简洁、直观的方式编写匿名函数。这一特性极大地提高了代码的可读性和可维护性,尤其...

    Java8的lambda表达式

    Java 8 的 Lambda 表达式是 Java 语言的一个重大更新,它引入了一种新的编程范式,使得函数式编程在 Java 中变得更为简洁和高效。Lambda 表达式允许我们将函数作为一个对象来处理,这在处理集合、事件驱动、多线程等...

    lambda使用详解

    类型推导是指编译器负责推导 lambda 表达式的类型,它利用 lambda 表达式所在上下文所期待的类型进行推导。方法引用是指 lambda 表达式允许我们定义一个匿名方法,并允许我们以函数式接口的方式使用它。函数式编程是...

Global site tag (gtag.js) - Google Analytics