Java8中Lambda表达式使用和Stream API详解

 更新时间:2019年05月18日 10:56:54   作者:猿在天  
这篇文章主要给大家介绍了关于Java8中Lambda表达式使用和Stream API的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

Java8 的新特性:Lambda表达式、强大的 Stream API、全新时间日期 API、ConcurrentHashMap、MetaSpace。总得来说,Java8 的新特性使 Java 的运行速度更快、代码更少、便于并行、最大化减少空指针异常。

0x00. 前置数据

private List<People> peoples = null;

@BeforeEach void before () {
  peoples = new ArrayList<>();
  peoples.add(new People("K.O1", 21, new Date()));
  peoples.add(new People("K.O3", 23, new Date()));
  peoples.add(new People("K.O4", 24, new Date()));
  peoples.add(new People("K.O5", 25, new Date()));
  peoples.add(new People("K.O2", 22, new Date()));
  peoples.add(new People("K.O6", 26, new Date()));
}

0x01. 提取对象中的一列

/**
* 提取1列
*/
@Test void whenExtractColumnSuccess () {
  //第一种写法
  List<Integer> ages1 = peoples.stream().map(people -> people.getAge()).collect(Collectors.toList());
  System.out.println("###println: args1----");
  ages1.forEach(System.out::println);

  //简单一点的写法
  List<Integer> ages2 = peoples.stream().map(People::getAge).collect(Collectors.toList());
  System.out.println("###println: args2----");
  ages1.forEach(System.out::println);
}

###println: args1----
21
22
23
24
25
26
###println: args2----
21
22
23
24
25
26

/**
  * 只要年纪大于25岁的人
  */
@Test void whenFilterAgeGT25Success () {
  List<People> peoples1 = peoples.stream().filter(x -> x.getAge() > 25).collect(Collectors.toList());
  peoples1.forEach(x -> System.out.println(x.toString()));
}

People{name='K.O6', age=26, birthday=Wed May 15 22:20:22 CST 2019}

0x03. 列表中对象数值型列数据求和

/**
  * 求和全部年纪
  */
@Test void sumAllPeopleAgeSuccess () {
  Integer sum1 = peoples.stream().collect(Collectors.summingInt(People::getAge));
  System.out.println("###sum1: " + sum1);
  Integer sum2 = peoples.stream().mapToInt(People::getAge).sum();
  System.out.println("###sum2: " + sum2);
}

    ###sum1: 141
    ###sum2: 141

0x04. 取出集合符合条件的第一个元素

/**
  * 取出年纪为25岁的人
  */
@Test void extractAgeEQ25Success () {
  Optional<People> optionalPeople = peoples.stream().filter(x -> x.getAge() == 25).findFirst();
  if (optionalPeople.isPresent()) System.out.println("###name1: " + optionalPeople.get().getName());

  //简写
  peoples.stream().filter(x -> x.getAge() == 25).findFirst().ifPresent(x -> System.out.println("###name2: " + x.getName()));
}

###name1: K.O5
###name2: K.O5

0x05. 对集合中对象字符列按规则拼接

/**
  * 逗号拼接全部名字
  */
@Test void printAllNameSuccess () {
  String names = peoples.stream().map(People::getName).collect(Collectors.joining(","));
  System.out.println(names);
}

K.O1,K.O2,K.O3,K.O4,K.O5,K.O6

0x06. 将集合元素提取,转为Map

/**
  * 将集合转成(name, age) 的map
  */
@Test void list2MapSuccess () {
  Map<String, Integer> map1 = peoples.stream().collect(Collectors.toMap(People::getName, People::getAge));
  map1.forEach((k, v) -> System.out.println(k + ":" + v));

  System.out.println("--------");

  //(name object)
  Map<String, People> map2 = peoples.stream().collect(Collectors.toMap(People::getName, People::getThis));
  map2.forEach((k, v) -> System.out.println(k + ":" + v.toString()));
}

//People中自己实现的方法
public People getThis () {
  return this;
}

K.O2:22
K.O3:23
K.O1:21
K.O6:26
K.O4:24
K.O5:25
--------
K.O2:People{name='K.O2', age=22, birthday=Wed May 15 22:42:39 CST 2019}
K.O3:People{name='K.O3', age=23, birthday=Wed May 15 22:42:39 CST 2019}
K.O1:People{name='K.O1', age=21, birthday=Wed May 15 22:42:39 CST 2019}
K.O6:People{name='K.O6', age=26, birthday=Wed May 15 22:42:39 CST 2019}
K.O4:People{name='K.O4', age=24, birthday=Wed May 15 22:42:39 CST 2019}
K.O5:People{name='K.O5', age=25, birthday=Wed May 15 22:42:39 CST 2019}

0x07. 按集合某一属性进行分组

/**
  * 按名字分组
  */
@Test void listGroupByNameSuccess() {
  //添加一个元素方便看效果
  peoples.add(new People("K.O1", 29, new Date()));
  Map<String, List<People>> map = peoples.stream().collect(Collectors.groupingBy(People::getName));

  map.forEach((k, v) -> System.out.println(k + ":" + v.size()));
}

K.O2:1
K.O3:1
K.O1:2
K.O6:1
K.O4:1
K.O5:1

0x08. 求集合对象数值列平均数

/**
  * 求人平均年龄
  */
@Test void averagingAgeSuccess () {
  Double avgAge = peoples.stream().collect(Collectors.averagingInt(People::getAge));
  System.out.println(avgAge);
}

23.5

0x09. 对集合按某一列排序

/**
  * 按年龄排序
  */
@Test void sortByAgeSuccess () {
  System.out.println("###排序前---");
  peoples.forEach(x -> System.out.println(x.getAge()));

  peoples.sort((x, y) -> {
    if (x.getAge() > y.getAge()) {
      return 1;
    } else if (x.getAge() == y.getAge()) {
      return 0;
    }
    return -1;
  });

  System.out.println("###排序后---");
  peoples.forEach(x -> System.out.println(x.getAge()));
}

###排序前---
21
23
24
25
22
26
###排序后---
21
22
23
24
25
26

未完待续

<源码地址:https://github.com/cos2a/learning-repo/tree/master/core-java8>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • Java语言实现扫雷游戏(1)

    Java语言实现扫雷游戏(1)

    这篇文章主要为大家详细介绍了Java语言实现的扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Java实现获取内网的所有IP地址

    Java实现获取内网的所有IP地址

    这篇文章主要介绍了如何利用Java语言实现获取内网的所有IP地址,文中的示例代码讲解详细,对我们学习有一定的参考价值,快跟随小编一起学习一下吧
    2022-06-06
  • Spring的@Transactional注解使用详细解析

    Spring的@Transactional注解使用详细解析

    这篇文章主要介绍了Spring的@Transactional注解使用详细解析,@Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功、要么同时失败,需要的朋友可以参考下
    2023-11-11
  • Springboot中拦截GET请求获取请求参数验证合法性核心方法

    Springboot中拦截GET请求获取请求参数验证合法性核心方法

    这篇文章主要介绍了Springboot中拦截GET请求获取请求参数验证合法性,在Springboot中创建拦截器拦截所有GET类型请求,获取请求参数验证内容合法性防止SQL注入,这种方法适用拦截get类型请求,需要的朋友可以参考下
    2023-08-08
  • JAVA开发环境搭建教程

    JAVA开发环境搭建教程

    这篇文章主要为大家详细介绍了JAVA开发环境搭建教程,配置JAVA开发环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • RocketMQ之NameServer架构设计及启动关闭流程源码分析

    RocketMQ之NameServer架构设计及启动关闭流程源码分析

    这篇文章主要为大家介绍了RocketMQ之NameServer架构设计及启动关闭流程源码分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • spring通过导入jar包和配置xml文件启动的步骤详解

    spring通过导入jar包和配置xml文件启动的步骤详解

    这篇文章主要介绍了spring通过导入jar包和配置xml文件启动,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • java实现电话本管理系统

    java实现电话本管理系统

    这篇文章主要为大家详细介绍了JAVA实现电话本管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • JVM创建对象及访问定位过程详解

    JVM创建对象及访问定位过程详解

    这篇文章主要介绍了JVM创建对象及访问定位过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • java使用google身份验证器实现动态口令验证的示例

    java使用google身份验证器实现动态口令验证的示例

    本篇文章主要介绍了java使用google身份验证器实现动态口令验证的示例,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08

最新评论