Stream的简单学习(三)之Collectors的简单用法

首先创建我们的数据

ArrayList<User> users = new ArrayList<>();
users.add(new User("张1",10));
users.add(new User("张2",40));
users.add(new User("张3",20));
users.add(new User("张4",30));
users.add(new User("张5",30));

以下操作都是在collect里进行

Collectors.toList】:转化成list

//获取所有对象中的姓名并转化成集合
List<String> collect1 = users.stream().map(User::getName).collect(Collectors.toList());
System.out.println(collect1);

结果:

[1,2,3,4,5]

Collectors.joining】:将在流的两个String元素之间插入定界符,共有三种方式

  • 无参数
  • 一个参数,分隔符
  • Collectors. joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix) 三个参数
    第一个是分隔符,第二个是头部拼接,第三个是尾部拼接
//将对象转化成字符串并用逗号分隔
String joined = users.stream().map(Object::toString).collect(Collectors.joining(",",")","U"));
System.out.println(joined);

结果:

User(name=1, age=10), User(name=2, age=40),
User(name=3, age=20), User(name=4, age=30),
User(name=4, age=30)

计算总和
Collectors.summingInt
Collectors.summingLong
Collectors.summingDouble

//计算所有年龄的总和
double total = users.stream().collect(Collectors.summingDouble(User::getAge));
System.out.println(total);

结果:

130

Collectors.groupingBy】:分组操作
一个参数:以xx分组
两个参数:以xx分组,并操作

//根据用户年龄进行分组操作
Map<Object, List<User>> byDept = users.stream().collect(Collectors.groupingBy(User::getAge));
System.out.println(byDept);

//用姓名分组,并获取年龄总和
Map<Object, Double> totalByDept = users.stream().collect(Collectors.groupingBy(User::getName, Collectors.summingDouble(User::getAge)));
System.out.println(totalByDept);

结果:

//结果1
{20.0=[User(name=3, age=20.0)], 
40.0=[User(name=2, age=40.0)], 
10.0=[User(name=1, age=10.0)], 
30.0=[User(name=4, age=30.0), 
User(name=5, age=30.0)]}
//结果2
{3=20.0,2=40.0,1=10.0,5=30.0,4=30.0}

Collectors.partitioningBy】:根据条件分为true和false两组

//将符合年龄为三十的为一组,小于30的为一组
Map<Boolean, List<User>> passingFailing = users.stream().collect(Collectors.partitioningBy(a -> a.getAge() >= 30));
System.out.println(passingFailing);

结果:

{false=[User(name=1, age=10.0), User(name=3, age=20.0)], true=[User(name=2, age=40.0), User(name=4, age=30.0), User(name=5, age=30.0)]}

Collectors.toMap】:转换成map

//以姓名为key,年龄为value封装为map
Map<String, Integer> collect = users.stream().collect(Collectors.toMap(User::getName, User::getAge));

结果:

{3=20,2=40,1=10,5=30,4=30}

maxBy】 获取年龄最大的
minBy】 获取年龄最小的

//获取年龄最大的
Optional<User> collect = users.stream().collect(Collectors.maxBy(Comparator.comparing(User::getAge)));
//获取年龄最小的
Optional<User> mincollect = users.stream().collect(Collectors.minBy(Comparator.comparing(User::getAge)));
System.out.println(collect);
System.out.println(mincollect);

结果:

//结果1
Optional[User(name=2, age=40.0)]
//结果2
Optional[User(name=1, age=10.0)]

Collectors.counting()】获取总数

Long collect1 = users.stream().collect(Collectors.counting());
System.out.println(collect1);

结果:

5

求平均数
averagingDouble
averagingLong
averagingInt

//结算年龄的平均值
Double collect2 = users.stream().collect(Collectors.averagingDouble(User::getAge));
System.out.println(collect2);

结果:

26.0

summarizingInt】:计算数量,总值,最大最小,平均值全部计算出来

//根据年龄计算数量,总值,最大最小,平均值
 DoubleSummaryStatistics collect = users.stream().collect(Collectors.summarizingDouble(User::getAge));
System.out.println(collect);

结果:

DoubleSummaryStatistics{count=5, sum=130.000000, min=10.000000, average=26.000000, max=40.000000}

Collectors.reducing】:类似reduce,将整个数据流的值规约为一个值

Double salIncrOverhead = users.stream().collect(Collectors.reducing(0.0, e -> e.getAge() + 100, (s1, s2) -> s1 + s2));
        System.out.println(salIncrOverhead);

结果:

630.0

看源码的时候会发现这些参数
在这里插入图片描述
下文会讲解一下函数式接口


另外我给大家提供了资料大礼包一份(共2G),大家可以关注我的公众号(在最下方!),回复:java面试题 来领取
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值