资讯专栏INFORMATION COLUMN

Java8-Lambda表达式使用与Stream API

endless_road / 567人阅读

摘要:前置数据提取对象中的一列提取列第一种写法简单一点的写法通过字段中条件过滤集合列表只要年纪大于岁的人列表中对象数值型列数据求和求和全部年纪取出集合符合条件的第一个元素取出年纪为岁的人简写对集合中对象

0x00. 前置数据
private List 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 ages1 = peoples.stream().map(people -> people.getAge()).collect(Collectors.toList());
    System.out.println("###println: args1----");
    ages1.forEach(System.out::println);

    //简单一点的写法
    List 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
0x02. 通过字段中条件过滤集合列表
/**
    * 只要年纪大于25岁的人
    */
@Test void whenFilterAgeGT25Success () {
    List 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 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 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 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> 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>

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77700.html

相关文章

  • Java8的流(stream)操作

    摘要:串行与并行可以分为串行与并行两种,串行流和并行流差别就是单线程和多线程的执行。返回串行流返回并行流和方法返回的都是类型的对象,说明它们在功能的使用上是没差别的。唯一的差别就是单线程和多线程的执行。 Stream是什么 Stream是Java8中新加入的api,更准确的说: Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便...

    yacheng 评论0 收藏0
  • Java8新特性总览

    摘要:新特性总览标签本文主要介绍的新特性,包括表达式方法引用流默认方法组合式异步编程新的时间,等等各个方面。还有对应的和类型的函数连接字符串广义的归约汇总起始值,映射方法,二元结合二元结合。使用并行流时要注意避免共享可变状态。 Java8新特性总览 标签: java [TOC] 本文主要介绍 Java 8 的新特性,包括 Lambda 表达式、方法引用、流(Stream API)、默认方...

    mayaohua 评论0 收藏0
  • Java 8 vs. Scala(二):Stream vs. Collection

    摘要:比如对一个数据流进行过滤映射以及求和运算,通过使用延后机制,那么所有操作只要遍历一次,从而减少中间调用。这里需知道中的元素都是延迟计算的,正因为此,能够计算无限数据流。 【编者按】在之前文章中,我们介绍了 Java 8和Scala的Lambda表达式对比。在本文,将进行 Hussachai Puripunpinyo Java 和 Scala 对比三部曲的第二部分,主要关注 Stream...

    GeekGhc 评论0 收藏0
  • JDK1.8-Stream中常用的API(流操作)

    摘要:运行机制分为源,中间操作,终止操作。反过来说,目前还无法专为某个并行流指定这个值。我们在本节中已经指出,并行流不总是比顺序流快。特别是和等依赖于元素顺序的操作,它们在并行流上执行的代价非常大。1 Stream Stream是一组用来处理数组,集合的API。 1.1 特性 不是数据结构,没有内部存储。 不支持索引访问。 延迟计算 支持并行 很容易生成数据或集合 支持过滤,查找,转换,汇总,...

    Shimmer 评论0 收藏0
  • Java 8 新特性之Stream API

    摘要:简而言之,提供了一种高效且易于使用的处理数据的方式。和以前的操作不同,操作还有两个基础的特征中间操作都会返回流对象本身。注意自己不会存储元素不会改变源对象,相反,它们会返回一个持有结果的新操作时延迟执行的。为集合创建并行流。 1. 概述 1.1 简介 Java 8 中有两大最为重要的改革,第一个是 Lambda 表达式,另外一个则是 Stream API(java.util.strea...

    cooxer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<