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

前言

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>

总结

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

(0)

相关推荐

  • Java8新特性lambda表达式有什么用(用法实例)

    我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值.现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作(bulk operation),解开lambda最强作用的神秘面纱. 1.关于JSR335 JSR是Java Specification Requests的缩写,意思是Java 规范请求,Java 8 版本的主要改进是 Lambda 项目(JSR 335),其

  • 详解Java8 Collect收集Stream的方法

    Collection, Collections, collect, Collector, Collectos Collection是Java集合的祖先接口. Collections是java.util包下的一个工具类,内涵各种处理集合的静态方法. java.util.stream.Stream#collect(java.util.stream.Collector<? super T,A,R>)是Stream的一个函数,负责收集流. java.util.stream.Collector 是一个收

  • Java8新特性之Lambda表达式浅析

    说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义. 一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是

  • Java8深入学习系列(一)lambda表达式介绍

    前言 最近在学习java8,所以接下来会给大家介绍一系列的Java8学习内容,那么让我们先从lambda表达式开始. 众所周知从java8出现以来lambda是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能. 很长一段时间java被吐槽是冗余和缺乏函数式编程能力的语言,随着函数式编程的流行java8种也引入了 这种编程风格.在此之前我们都在写匿名内部类干这些事,但有时候这不是好的做法,本文中将介绍和使用lambda, 带你体验函数式编程的魔力. 什么是lambda? lambda表达

  • 浅析Java8新特性Lambda表达式和函数式接口

    什么是Lambda表达式,java8为什么使用Lambda表达式? "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.我们可以把 Lambda表达式理解为是 一段可以传递的代码.最直观的是使用Lambda表达式之后不用再写大量的匿名内部类,简化代码,提高了代码的可读性. // 启动一个线程,不使用Lambda

  • Java8中的 Lambda表达式教程

     1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成λ表达式后是这个样子: (int x, int y) -> x + y; 参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y) -> x + y; //返回两数之和 或者 (x, y) -> { return x + y; } //显式指明返回值 可见λ表达式有三部分组成:参数列表,箭头(-&g

  • java8使用Stream API方法总结

    Stream是java8中处理集合的关键抽象概念,它可以指定您希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询. Stream 的三个操作步骤 1.创建Stream. 得到Stream流的第一种方式: 可以通过Collection系列集合提供提供的Stream()或parallelStream @Test public void test1() { //可以通过Collection系列集合提供提供的

  • Java8新特性Lambda表达式的一些复杂用法总结

    简介 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数. 本文将介绍关于Java8 Lambda表达式的一些复杂用法,分享出来供大家参考学习,下面来一起看看详细的介绍: 复杂用法实例 传入数组ids,在list<Obj>上操作,找出Obj中id想匹配的,并且按

  • Java8 Lambda表达式详解及实例

    第一个Lambda表达式 在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式: Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello runnable"); } }; ... thread.start(); 上面的例子如果改成使用Lambda就会简单许多: Runnable noArgs = ()->System.out.print

  • Java8中lambda表达式的应用及一些泛型相关知识

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public class Employee { public String name; public int age; public char sex; public String time; public int salary; } 我们有一列此类数据 List<Employee> data = Arrays.asL

随机推荐