Lambda表达式学习

对List<Integer> userIdList = UserList.stream().map(User::getUserId).collect(Collectors.toList());的解析

 1    public static void main(String[] args)
2 {
3 // 声明实验对象
4 User user1 = new User();
5 user1.setUserId(1);
6 User user2 = new User();
7 user2.setUserId(2);
8 //创建集合
9 List<User> UserList = new ArrayList<>();
10 UserList.add(user1);
11 UserList.add(user2);
12 // 执行方法:解析== 将对象集合转为流,以map的形式获取到所有的User对象中的UserId值,并以list集合的形式返回
13 List<Integer> userIdList = UserList.stream().map(User::getUserId).collect(Collectors.toList());
14 // 打印结果
15 System.out.println("userIdList = " + userIdList);
16 }

结果:userIdList = [1, 2]
著作:王子威

同等方法解析

 1     @Test
2 public void tongDeng(){
3 // 声明实验对象
4 User user1 = new User();
5 user1.setUserId(1);
6 User user2 = new User();
7 user2.setUserId(2);
8 //创建集合
9 List<User> UserList = new ArrayList<>();
10 UserList.add(user1);
11 UserList.add(user2);
12 // 解析Collectors.toList() 同等于 创建集合和添加值
13 List<Integer> userIdList = new ArrayList<>();
14 //解析map(User::getUserId) 同等于 循环user.getUserId()
15 for(User user : UserList){
16 userIdList.add(user.getUserId());
17 }
18 // 打印结果
19 System.out.println("userIdList = " + userIdList);
20 }
结果:userIdList = [1, 2]
著作:王子威

注意:Collectors可以返回的其他20类型

1.返回List集合: toList()

用于将元素累积到List集合中。它将创建一个新List集合(不会更改当前集合)。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
integers.stream().map(x -> x*x).collect(Collectors.toList());// output: [1,4,9,16,25,36,36]

2.返回Set集合: toSet()

用于将元素累积到Set集合中。它会删除重复元素。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
integers.stream().map(x -> x*x).collect(Collectors.toSet());// output: [1,4,9,16,25,36]

3.返回指定的集合: toCollection()

可以将元素雷击到指定的集合中。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
integers
   .stream()
   .filter(x -> x >2)
   .collect(Collectors.toCollection(LinkedList::new));// output: [3,4,5,6,6]

4.计算元素数量: Counting()

用于返回计算集合中存在的元素个数。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
Long collect = integers
                  .stream()
                  .filter(x -> x <4)
                  .collect(Collectors.counting());// output: 3

5.求最小值: minBy()

用于返回列表中存在的最小值。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
List<String> strings = Arrays.asList("alpha","beta","gamma");
integers
   .stream()
   .collect(Collectors.minBy(Comparator.naturalOrder()))
   .get();// output: 1strings
  .stream()
  .collect(Collectors.minBy(Comparator.naturalOrder()))
  .get();// output: alpha
按照整数排序返回1,按照字符串排序返回alpha

可以使用reverseOrder()方法反转顺序。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
List<String> strings = Arrays.asList("alpha","beta","gamma");
integers
   .stream()
   .collect(Collectors.minBy(Comparator.reverseOrder()))
   .get();// output: 6strings
  .stream()
  .collect(Collectors.minBy(Comparator.reverseOrder()))
  .get();// output: gamma
同时可以自定义的对象定制比较器。

6.求最大值: maxBy()

和最小值方法类似,使用maxBy()方法来获得最大值。

List<String> strings = Arrays.asList("alpha","beta","gamma");
strings
  .stream()
  .collect(Collectors.maxBy(Comparator.naturalOrder()))
  .get();// output: gamma

7.分区列表:partitioningBy()

用于将一个集合划分为2个集合并将其添加到映射中,1个满足给定条件,另一个不满足,例如从集合中分离奇数。因此它将在map中生成2条数据,1个以true为key,奇数为值,第2个以false为key,以偶数为值。

List<String> strings = Arrays.asList("a","alpha","beta","gamma");
Map<Boolean, List<String>> collect1 = strings
         .stream()
         .collect(Collectors.partitioningBy(x -> x.length() > 2));// output: {false=[a], true=[alpha, beta, gamma]}
这里我们将长度大于2的字符串与其余字符串分开

8.返回不可修改的List集合:toUnmodifiableList()

用于创建只读List集合。任何试图对此不可修改List集合进行更改的尝试都将导致UnsupportedOperationException。

List<String> strings = Arrays.asList("alpha","beta","gamma");
List<String> collect2 = strings
      .stream()
      .collect(Collectors.toUnmodifiableList());// output: ["alpha","beta","gamma"]

9.返回不可修改的Set集合:toUnmodifiableSet()

用于创建只读Set集合。任何试图对此不可修改Set集合进行更改的尝试都将导致UnsupportedOperationException。它会删除重复元素。

List<String> strings = Arrays.asList("alpha","beta","gamma","alpha");
Set<String> readOnlySet = strings
      .stream()
      .sorted()
      .collect(Collectors.toUnmodifiableSet());// output: ["alpha","beta","gamma"]

10.连接元素:Joining()

用指定的字符串链接集合内的元素。

List<String> strings = Arrays.asList("alpha","beta","gamma");
String collect3 = strings
    .stream()
    .distinct()
    .collect(Collectors.joining(","));// output: alpha,beta,gammaString collect4 = strings
    .stream()
    .map(s -> s.toString())
    .collect(Collectors.joining(",","[","]"));// output: [alpha,beta,gamma]

11.Long类型集合的平均值:averagingLong()

查找Long类型集合的平均值。

注意:返回的是Double类型而不是 Long类型

List<Long> longValues = Arrays.asList(100l,200l,300l);
Double d1 = longValues
   .stream()
   .collect(Collectors.averagingLong(x -> x * 2));// output: 400.0

12.Integer类型集合的平均值:averagingInt()

查找Integer类型集合的平均值。

注意:返回的是Double类型而不是 int类型

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
Double d2 = integers
   .stream()
   .collect(Collectors.averagingInt(x -> x*2));// output: 7.714285714285714

13.Double类型集合的平均值:averagingDouble()

查找Double类型集合的平均值。

List<Double> doubles = Arrays.asList(1.1,2.0,3.0,4.0,5.0,5.0);
Double d3 = doubles
   .stream()
   .collect(Collectors.averagingDouble(x -> x));// output: 3.35

14.创建Map:toMap()

根据集合的值创建Map。

List<String> strings = Arrays.asList("alpha","beta","gamma");
Map<String,Integer> map = strings
      .stream()
      .collect(Collectors
         .toMap(Function.identity(),String::length));// output: {alpha=5, beta=4, gamma=5}
创建了一个Map,其中集合值作为key,在集合中的出现次数作为值。

在创建map时处理列表的重复项

集合中可以包含重复的值,因此,如果想从列表中创建一个Map,并希望使用集合值作为map的key,那么需要解析重复的key。由于map只包含唯一的key,可以使用比较器来实现这一点。

List<String> strings = Arrays.asList("alpha","beta","gamma","beta");
Map<String,Integer> map = strings
       .stream()
       .collect(Collectors
         .toMap(Function.identity(),String::length,(i1,i2) -> i1));// output: {alpha=5, gamma=5, beta=4}
Function.identity()指向集合中的值,i1和i2是重复键的值。可以只保留一个值,这里选择i1,也可以用这两个值来计算任何东西,比如把它们相加,比较和选择较大的那个,等等。

15.整数求和:summingInt ()

查找集合中所有整数的和。它并不总是初始集合的和,就像我们在下面的例子中使用的我们使用的是字符串列表,首先我们把每个字符串转换成一个等于它的长度的整数,然后把所有的长度相加。

List<String> strings = Arrays.asList("alpha","beta","gamma");
Integer collect4 = strings
     .stream()
     .collect(Collectors.summingInt(String::length));// output: 18
或直接集合值和

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
Integer sum = integers
   .stream()
   .collect(Collectors.summingInt(x -> x));// output: 27

16.double求和:summingDouble ()

类似于整数求和,只是它用于双精度值

List<Double>  doubleValues = Arrays.asList(1.1,2.0,3.0,4.0,5.0,5.0);
Double sum = doubleValues
    .stream()
    .collect(Collectors.summingDouble(x ->x));// output: 20.1

17.Long求和:summingLong ()

与前两个相同,用于添加long值或int值。可以对int值使用summinglong(),但不能对long值使用summingInt()。

List<Long> longValues = Arrays.asList(100l,200l,300l);
Long sum = longValues
   .stream()
   .collect(Collectors.summingLong(x ->x));// output: 600

18.Long求和:summingLong ()

与前两个相同,用于添加long值或int值。可以对int值使用summinglong(),但不能对long值使用summingInt()。

List<Long> longValues = Arrays.asList(100l,200l,300l);
Long sum = longValues
   .stream()
   .collect(Collectors.summingLong(x ->x));// output: 600

19.汇总整数:summarizingInt ()

它给出集合中出现的值的所有主要算术运算值,如所有值的平均值、最小值、最大值、所有值的计数和总和。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
IntSummaryStatistics stats = integers
         .stream()
         .collect(Collectors.summarizingInt(x -> x ));//output: IntSummaryStatistics{count=7, sum=27, min=1, average=3.857143, max=6}
可以使用get方法提取不同的值,如:

stats.getAverage();   // 3.857143stats.getMax();       // 6stats.getMin();       // 1stats.getCount();     // 7stats.getSum();       // 27

20.分组函数:GroupingBy ()

GroupingBy()是一种高级方法,用于从任何其他集合创建Map。

List<String> strings = Arrays.asList("alpha","beta","gamma");
Map<Integer, List<String>> collect = strings
         .stream()
         .collect(Collectors.groupingBy(String::length));// output: {4=[beta, beta], 5=[alpha, gamma]}
它将字符串长度作为key,并将该长度的字符串列表作为value。

List<String> strings = Arrays.asList("alpha","beta","gamma");
Map<Integer, LinkedList<String>> collect1 = strings
           .stream()
           .collect(Collectors.groupingBy(String::length, 
               Collectors.toCollection(LinkedList::new)));// output: {4=[beta, beta], 5=[alpha, gamma]}
这里指定了Map中需要的列表类型(Libkedlist)。

Java_lambda表达式之"stream流学习,Map学习,collect学习,Conllectors工具类学习"的更多相关文章

  1. lamda表达式与Stream 流操作,reduce,flatMap,groupingBy等

    /** * 符合lambda表达式的接口也叫函数式接口: * 除了默认方法和Object类的方法外,只有一个抽象方法的接口才能符合lambda表达式的要求 * 可以使用@FunctionalInter ...

  2. JAVA基础学习之 Map集合、集合框架工具类Collections,Arrays、可变参数、List和Set集合框架什么时候使用等(4)

    package com.itcast.test20140113; import java.util.ArrayList; import java.util.Arrays; import java.ut ...

  3. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  4. Properties工具类学习

    Properties类学习 1.定义 Properties,java.utils包下的一个工具类,主要用于读取Java的配置文件.各种语言都有自己所支持的配置文件,配置文件中很多变量是经常变动的. 这 ...

  5. commons-lang3工具类学习(二)

    三.BooleanUtils 布尔工具类 and(boolean... array) 逻辑与 BooleanUtils.and(true, true)         = true    Boolea ...

  6. commons-lang3工具类学习(一)

    一.ArchUtils java运行环境的系统信息工具类 getArch();// 获取电脑处理器体系结构 32 bit.64 bit.unknown    getType();// 返回处理器类型 ...

  7. DBUtils工具类学习一

    Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能 1.特征 DBUtils是java编程中 ...

  8. Java 中待总结工具类学习(自定义注解,读取配置,字面List)

    1.使用 MessageFormat 格式化文本 int planet = 7; String event = "a disturbance in the Force"; Stri ...

  9. java中map和对象互转工具类的实现示例

    在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且用起来也还算方便,比如像fastJson就可以轻松实现map ...

随机推荐

  1. 【C# 线程】 volatile 关键字和Volatile类、Thread.VolatileRead|Thread.VolatileWrite 详细 完整

    overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...

  2. 60天shell脚本计划-8/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月3日 --修改时间:2021年3月7日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在评 ...

  3. 哈工大 NLP 实验一 汉语分词系统

    NLP实验代码可见github:NLP实验代码整理 本实验会查重,而且写起来难度比较大,建议早一些开始.实验报告要用顶会论文形式呈现,建议使用overleaf里的ACL论文latex模板比较方便一点.

  4. Pycharm:如果想验证一个文件中的函数

    在该文件的函数后写上两句 def test(): pass if __name__='__main__': test() 这样就可以执行该函数 如果只是在其他文件中导入了该函数,则不会执行最后两段话, ...

  5. JZ-037-数字在排序数组中出现的次数

    数字在排序数组中出现的次数 题目描述 统计一个数字在升序数组中出现的次数. 题目链接: 数字在排序数组中出现的次数 代码 /** * 标题:数字在排序数组中出现的次数 * 题目描述 * 统计一个数字在 ...

  6. LeetCode-129-求根节点到叶节点数字之和

    求根节点到叶节点数字之和 题目描述:给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字. 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 ...

  7. LOTO示波器汽修专用款选型指南

    LOTO示波器汽修专用款选型指南 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测.汽修应用中,工程师对示波器的性能要求对于LOTO产品来说不算高. 在我们销售和技术支持的积累过程中,我 ...

  8. 『现学现忘』Docker相关概念 — 6、虚拟化技术分类

    目录 1.按照虚拟化的程度分类 (1)完全虚拟化技术 (2)半虚拟化技术 (3)完全虚拟化与半虚拟化优缺点 2.从虚拟化架构分类 (1)寄居架构 (2)裸金属架构 虚拟化是一个广义的术语,是指计算元件 ...

  9. Thinkphp3.2数据库字段自动转小写,字段大小写自动转换,以及thinkphp3一些bug

    公司在使用thinkphp框架,版本也有些老,被一些bug坑了,记录一下 自动转小写解决办法,最简单的就是在配置文件加上 'DB_PARAMS' => [\PDO::ATTR_CASE => ...

  10. scoped样式

    scoped样式 作用∶让样式在局部生效防止冲突 写法∶<style scoped> 比如School组件和Student组件的样式名一样,当组件汇总到一起时样式会冲突.所以加上scope ...