主要内容

1. Lambda 表达式
2. 函数式接口
3. 方法引用与构造器引用
4. Stream API
5. 其他新特性

Java 8新特性简介

速度更快
代码更少(增加了新的语法 Lambda 表达式)
强大的 Stream API
便于并行
最大化减少空指针异常 Optional

1、Lambda表达式

Lambda 是一个匿名函数

在Java 语言中引入了一个新的语法元
素和操作符。这个操作符为 “->” , 该操作符被称
为 Lambda 操作符或剪头操作符。它将 Lambda 分为
两个部分:
左侧:指定了 Lambda 表达式需要的所有参数
右侧:指定了 Lambda 体,即 Lambda 表达式要执行
的功能。

2、Lambda 表达式语法

语法格式一:无参,无返回值,Lambda 体只需一条语句

Runnable r1 = () → System.out.println("hello world");

语法格式二:Lambda 需要一个参数

Consumerfun = (args) → System.out.println(args);

语法格式三:Lambda 只需要一个参数时,参数的小括号可以省略

Consumerfun = args → System.out.println(args);

语法格式四:Lambda 需要两个参数,并且有返回值

BinaryOperator<Long> bo = (x, y) → {System.out.println("hello world");reurn x + y;}

语法格式五:当 Lambda 体只有一条语句时,return 与大括号可以省略

BinaryOperator<Long> bo = (x, y) → x + y;

语法格式六:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”

BinaryOperator<Long> bo = (Longx, Long y) → {System.out.println("hello world");reurn x + y;}

类型推断:
上述 Lambda 表达式中的参数类型都是由编译器推断
得出的。Lambda 表达式中无需指定类型,程序依然可
以编译,这是因为 javac 根据程序的上下文,在后台
推断出了参数的类型。Lambda 表达式的类型依赖于上
下文环境,是由编译器推断出来的。这就是所谓的
“类型推断”

2、函数式接口

(1) 只包含一个抽象方法的接口,称为函数式接口。
(2) 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 
表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方
法上进行声明)。
(3) 我们可以在任意函数式接口上使用 @FunctionalInterface 注解,
这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包
含一条声明,说明这个接口是一个函数式接口。

自定义函数式接口

@FounctionalInterfacepublic interface MyNumber {public double getValue();}@FounctionalInterfacepublic interface MyNumber<T> {public T getValue(T t);}

作为参数传递 Lambda 表达式

ListenableFuture<Integer> speechTechniqueMacdFuture = executorService.submit( () -> 1+1);

3、Java 内置四大核心函数式接口

函数式接

参数类型

返回类型

用途

Consumer
消费型接口

T void 对类型为T的对象应用操
作,包含方法:
void accept(T t)
Supplier供给型 无 

返回类型为T的对象,包
含方法:T get();

Function函数型 R 对类型为T的对象应用操作,并返回结果。结果是R类型的对象。包含方法:R apply(T t)
Predicate断定型 T boolea 确定类型为T的对象是否满足某约束,并返回boolean 值。包含方法boolean test(T t)

4、方法引用与构造器引用

方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来

对象::实例方法

类::静态方法

类::实例

Functionin = Integer[]::new;.stream().sorted(Comparator.comparingLong(ConditionAllVO::getStockTotalCount).reversed()).collect(Collectors.toList()))

5、强大的 Stream API

是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列“集合讲的是数据,流讲的是计算

注意:

(1)Stream 自己不会存储元素。

(2)Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。

(3)Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行

Lists.newArrayList().stream() : 返回一个顺序流Lists.newArrayList().parallelStream() : 返回一个并行流Arrays.stream(new Integer[1]).count();Stream stream = Stream.of(Lists.newArrayList());

Stream 的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,

否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”。

筛选

方 法

描述

filter(Predicate p)

接收 Lambda , 从流中排除某些元素。

distinct() 筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复
limit(long maxSize) 截断流,使其元素不超过给定数
skip(long n) 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n)  互补

映射

方 法

描述

map(Function f) 接收一个函数作为参数,该函数会被应用到每个素上,并将其映射成一个新的
mapToDouble(ToDoubleFunction f)

接收一个函数作为参数,该函数会被应用到每个元
素上,产生一个新的 DoubleStream。

mapToInt(ToIntFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 IntStream
mapToLong(ToLongFunction f) 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 LongStream

flatMap(Function f)

flatMapToDouble(Function f)

flatMapToInt(Function f)

flatMapToLong(Function f)

接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

排序

方 法

描述

sorted() 产生一个新流,其中按自然顺序
sorted(Comparator comp) 产生一个新流,其中按比较器顺序

查找与匹配

方 法

描述

allMatch(Predicate p) 检查是否匹配所有元素
anyMatch(Predicate p) 检查是否至少匹配一个元素
noneMatch(Predicate p) 检查是否没有匹配所有元素
findFirst() 返回第一个元素
findAny() 返回当前流中的任意元素
count() 返回流中元素个数
max(Comparator c) 返回流中最大值
min(Comparator c) 返回流中最小值
forEach(Consumer c) 内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了

归约

方 法

描述

reduce(T iden, BinaryOperator b)

可以将流中元素反复结合起来,得到一个值。返回 T
reduce(BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 Optional

收集

方 法

描述

collect(Collector c) 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法

方法

返回类型

作用

toList List 把流中元素收集到List:list.stream().collect(Collectors.toList());
toSet Set 把流中元素收集到Set:list.stream().collect(Collectors.toSet());

toCollection

Collection 把流中元素收集到创建的集合:list.stream().collect(Collectors.toCollection(ArrayList::new));
counting Long

计算流中元素的个数:list.stream().collect(Collectors.counting());

summingInt Integer 对流中元素的整数属性求和:list.stream().collect(Collectors.summingInt(类名::属性名));
averagingInt Double 计算流中元素Integer属性的平均值:list.stream().collect(Collectors.averagingInt(类名::属性名));

summarizingInt

summarizingLong

summarizingDouble

IntSummaryStatistics

收集流中Integer属性的统计值:list.stream().collect(Collectors.summarizingInt(类名::属性名));

一次性得到元素个数、总和、均值、最大值、最小值

joining

String

连接流中每个字符串:
list.stream().map(类名::属性名).collect(Collectors.joining());

maxBy

Optional 根据比较器选择最大值:
list.stream().collect(Collectors.maxBy(comparingInt(类名::属性名)));
minBy Optional 根据比较器选择最小值:list.stream().collect(Collectors.minBy(comparingInt(类名::属性名))
reducing 归约产生的类型

从一个作为累加器的初始值开始,利用BinaryOperator与流中元素逐个结合,从而归约成单个值

list.stream().collect(Collectors.reducing(0, 类名::属性名, Integer::sum));

collectingAndThen 转换函数返回的类型 包裹另一个收集器,对其结果转换函数:list.stream().collect(Collectors.collectingAndThen(Collectors.toList(), List::size));
groupingBy 根据 Map

某属性值对流分组,属性为K,结果为V:

list.stream().collect(Collectors.groupingBy( 类名::属性名));

partitioningBy Map> 根据true或false进行分区:list.stream().collect(Collectors.partitioningBy(类名::属性名)

6、并行流与串行流

并行流就是把一个内容分成多个数据块,并用不同的线程分
别处理每个数据块的流。
Java 8 中将并行进行了优化,我们可以很容易的对数据进行并
行操作。Stream API 可以声明性地通过 parallel() 与
sequential() 在并行流与顺序流之间进行切换。

7、Optional 类

Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,
原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且
可以避免空指针异常。
常用方法:
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

给个[在看],是对IT老哥最大的支持

lambda 对象去重_最火的java8新特性:Lambda 表达式相关推荐

  1. Java8新特性 Lambda、Stream、Optional实现原理

    Java8新特性 Lambda.Stream.Optional实现原理 一.接口中默认方法修饰为普通方法 二.Lambda表达式 2.1.什么是Lambda表达式 2.2.为什么要使用Lambda表达 ...

  2. Java8新特性----Lambda表达式详细探讨

    Java8新特性 Lambda表达式 入门演示 案例1 如何解决 cannot be cast to java.lang.Comparable问题? 案例2 优化方式一 : 策略设计模式 优化方式二: ...

  3. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

    一提到java是一种什么语言? 大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的 ...

  4. java8新特性-lambda表达式入门学习

    定义 jdk8发布新特性中,lambda是一大亮点之一.lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率.Lambda 表达式"(lambda expressi ...

  5. Java8新特性——lambda表达式

    什么是lambda表达式? Lambda 表达式是Java 8 的新特性,是一种新的编程语法.lambda语义简洁明了,性能良好,是Java 8 的一大亮点.废话不多说,我们来看个例子. 从内部类到l ...

  6. java8新特性-lambda表达式和stream API的简单使用

    一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  7. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  8. fundamentals\java\java8新特性-Lambda(译自oracle官网)

    Java8 Lambda Expressions 目录 Java8 Lambda Expression 典型使用场景:Ideal Use Case for Lambda Expressions 问题提 ...

  9. java8新特性lambda表达式概述

    定义 ​ jdk8发布新特性中,lambda是一大亮点之一.lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率.Lambda 表达式"(lambda expres ...

最新文章

  1. linux uname 命令详解
  2. C语言程序设计 练习1-13
  3. PyTorch 《动手学深度学习》学习笔记(Dive-into-DL-Pytorch)
  4. android给图片加边框,Android学习笔记进阶19之给图片加边框
  5. 数据库实践丨MySQL多表join分析
  6. 元组中[-1]的作用
  7. cmd查看所有数据库 db2_民生银行数据库自动化部署的探索与实践
  8. shell类型、添加PATH环境变量、.bashrc、.profile、/etc/profile、/etc/environment
  9. 【Android】两种动画介绍(Tween动画、Frame动画)
  10. 《数值分析》学习笔记 ·003——数值计算中应该注意的几个问题
  11. Android 微信高性能日志存储库Xlog的使用
  12. 如何将硬盘数据迁移包括系统一起迁移到另一个硬盘?
  13. 国美易卡围绕数据云等科技,国美易卡解决问题
  14. GIT (分布式版本控制系统)
  15. 龙门标局:注册地理标志证明商标有什么作用
  16. 好玩的微信互动小游戏有哪些?微信小程序游戏倾情推荐?
  17. 打开chm文件的其他方式
  18. DOCK软件测试大乐,科学网-Docking软件大比拼-袁曙光的博文
  19. 泰勒公式矩阵形式_多元函数泰勒公式的张量表示
  20. c++ SFML 获取ftp某个目录下所有的文件或者文件夹

热门文章

  1. AMD EPYC——CPU命名规则
  2. 金融业对区块链必须有足够认识
  3. 使用hiredis实现redis分布式锁
  4. 导入依赖和加上注释后,lombok gettersetter识别不到
  5. Vue003_class 与style 绑定
  6. leetcode 622. Design Circular Queue | 622. 设计循环队列(Ring Buffer)
  7. leetcode 455. 分发饼干(Java版)
  8. leetcode 242. 有效的字母异位词(Java版)
  9. C#连接MySQL数据库 制作股票交易模拟程序
  10. 排序算法 - 面试中的排序算法总结