一. Lambda
Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
语法:
Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为两个部分:

**左侧:**指定了 Lambda 表达式需要的所有参数

**右侧:**指定了 Lambda 体,即 Lambda 表达式要执行的功能
语法格式一:无参,无返回值,Lambda体只需一条语句

Runnable r1 =() -> System.out.println("hh");

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

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

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

Comparator<Integer> comparator = (x , y)->{System.out.println("包含多条语句应有大括号");System.out.println("比较x,y的大小");return Integer.compare(x,y);
};

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

Comparator<Integer> comparator = (x,y)->Integer.compare(x,y);

语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“数据推断”

类型推断

上述 Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断“
二. 函数式接口
1.定义
⚫ 只包含一个抽象方法的接口,称为函数式接口。

⚫ 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda

表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方

法上进行声明)。

⚫ 我们可以在任意函数式接口上使用 @FunctionalInterface 注解,

这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包

含一条声明,说明这个接口是一个函数式接口。

函数式接口可以作为参数。
2.自定义函数是接口

3.作为参数传递Lambda 表达式

三. java四大内置的函数接口

其它接口:

四. 引用
对象 :: 实例方法
类 :: 静态方法
类 :: 实例方法


五、Stream的API
1.什么是Stream
(1)简介
Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一

个则是 Stream API(java.util.stream.*)。

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对

集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。

使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数

据库查询。也可以使用 Stream API 来并行执行操作。简而言之,

Stream API 提供了一种高效且易于使用的处理数据的方式。

(2)什么是Stream
流(Stream) 到底是什么呢?

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

“集合讲的是数据,流讲的是计算!”

注意:

①Stream 自己不会存储元素。

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

③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
2.Stream的操作三个步骤
⚫ 创建 Stream

一个数据源(如:集合、数组),获取一个流

⚫ 中间操作

一个中间操作链,对数据源的数据进行处理

⚫ 终止操作(终端操作)

一个终止操作,执行中间操作链,并产生结果
3.创建Stream
Java8 中的 Collection 接口被扩展,提供了两个获取流的方法:

⚫ default Stream stream() : 返回一个顺序流

⚫ default Stream parallelStream() : 返回一个并行流

(1)由数组创建流
Java8 中的 Arrays 的静态方法 stream() 可以获取数组流:

⚫ static Stream stream(T[] array): 返回一个流重载形式,能够处理对应基本类型的数组:

⚫ public static IntStream stream(int[] array)

⚫ public static LongStream stream(long[] array)

⚫ public static DoubleStream stream(double[] array)

(2)由值创建流
可以使用静态方法 Stream.of(), 通过显示值创建一个流。它可以接收任意数量的参数。

⚫ public static Stream of(T… values) : 返回一个流

(3)由函数创建流:创建无限流
可以使用静态方法 Stream.iterate() 和Stream.generate(), 创建无限流。

⚫ 迭代

public static Stream iterate(final T seed, final

UnaryOperator f)

⚫ 生成

public static Stream generate(Supplier s) :

@Testpublic void test06(){//1.可以通过Collection系列集合提供的stream()或parallelStream()//集合流:// - Collection.stream() 穿行流// - Collection.parallelStream() 并行流List<String> list = new ArrayList<>();Stream<String> stream1 = list.stream();//2.通过Arrays中的静态方法stream()获取数组连接//Arrays.stream(array)String[] strings = new String[10];Stream<String> stream2 = Arrays.stream(strings);//3.通过Stream 类中静态方法of()//Stream.of(...)Stream<Integer> stream3 = Stream.of(1, 2, 3);//4.创建无限流//迭代Stream<Integer> stream4 = Stream.iterate(0, (i) -> i+2);stream4.limit(10).forEach(System.out::println);//生成Stream.generate(() -> Math.random()).limit(5).forEach(System.out::println);}

Java8新特性学习(lambda,函数式接口,stream,Optional)相关推荐

  1. Java高级:新特性:lambda 函数式接口 方法引用 StreamAPI Optional类

    package com.atguigu.java1;import org.junit.Test;import java.util.Comparator;/*** Lambda表达式使用举例:** @a ...

  2. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  3. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  4. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  5. Java8新特性学习笔记

    Java8新特性学习笔记 文章目录 Java8新特性学习笔记 一.接口和日期处理 1.接口增强 1.1.JDK8以前 VS JDK8 1)接口定义: 1.2.默认方法(default) 1)默认方法格 ...

  6. java8新特性之lambda表达式--超级详细版本

    java8新特性之lambda表达式 1.什么是lambda表达式?为什么用它? 2. 为什么Java需要lambda表达式? 3. lambda表达式的语法 4.函数式接口 4.1 什么是函数式接口 ...

  7. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  8. Java JDK1.8新特性之四大函数式接口

    JDK 1.8的一些新特性 四大核心函数式接口(Consumer.Predicate.Supplier.Function),结合lambda表达式 import java.util.ArrayList ...

  9. 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)

    1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...

  10. java8新特性学习笔记(Lambda,stream(),filter(),collect(),map())

    文章目录 1.lambda表达式(重点) 1.需求分析 2.Lambda表达式初体验 3.Lambda的语法规则 3.1 Lambda练习1 3.1 Lambda练习2 4.Lambda表达式的原理 ...

最新文章

  1. linux下chmod使用
  2. hdu1.3.8 As Easy As A+B
  3. 八十、React中的容器组件和无状态组件
  4. 【QuotationTool】主要数据结构
  5. 从零开始学Node.js(二)
  6. 解决IIS7.5及以后中URL文件名有加号或空格导致显示404错误的问题
  7. HTML5+CSS3 Pink老师课后作业——小米logo过渡切换的实现
  8. cocos2dx 显示html,cocos2dx - 在游戏中显示HTML页面
  9. get/post在线接口
  10. SpringBoot的yml配置文件(三)
  11. 切!原来进入500强就那么简单啊——前IBM,HP,Dell员工揭开外企的招聘内幕
  12. mixamo_Mixamo的动画商店插件现在支持Mecanim!
  13. 云服务器php上传文件大小,php 上传远程服务器文件大小
  14. Android手机听筒和扬声器切换
  15. 程序员的“荣”与“耻”之我见
  16. 万能码码上付给你一个惊喜(安全扫码专业委员会)
  17. 如何在本地磁盘安装PE系统
  18. 简单的手机抓包软件(小黄鸟)HttpCanary
  19. 【Code pratice】—— 纸牌三角形
  20. 生鲜企业为什么要使用蔬菜配送系统?

热门文章

  1. 数学知识补充(一)度量空间
  2. 用Delphi自制英语复读机
  3. 细数 TS 中那些奇怪的符号
  4. 软考高项 ——【项目风险管理】
  5. HTML5 Canvas编写五彩连珠(2):画图
  6. 系统学习金融数据挖掘 之爬虫技术基础(附源代码)(网页结构基础)
  7. 分享个甲铁城手游的辅助脚本,能够自动刷副本刷资源
  8. 页面加密代码,附效果演示
  9. 计算机网络脆弱性评估技术研究
  10. 一、三种基本的共享上网方式: