Java8新特性学习(lambda,函数式接口,stream,Optional)
一. 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)相关推荐
- Java高级:新特性:lambda 函数式接口 方法引用 StreamAPI Optional类
package com.atguigu.java1;import org.junit.Test;import java.util.Comparator;/*** Lambda表达式使用举例:** @a ...
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行 Stream的.max方 ...
- 【java8新特性】——lambda表达式与函数式接口详解(一)
一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...
- Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解
Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...
- Java8新特性学习笔记
Java8新特性学习笔记 文章目录 Java8新特性学习笔记 一.接口和日期处理 1.接口增强 1.1.JDK8以前 VS JDK8 1)接口定义: 1.2.默认方法(default) 1)默认方法格 ...
- java8新特性之lambda表达式--超级详细版本
java8新特性之lambda表达式 1.什么是lambda表达式?为什么用它? 2. 为什么Java需要lambda表达式? 3. lambda表达式的语法 4.函数式接口 4.1 什么是函数式接口 ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- Java JDK1.8新特性之四大函数式接口
JDK 1.8的一些新特性 四大核心函数式接口(Consumer.Predicate.Supplier.Function),结合lambda表达式 import java.util.ArrayList ...
- 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)
1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...
- java8新特性学习笔记(Lambda,stream(),filter(),collect(),map())
文章目录 1.lambda表达式(重点) 1.需求分析 2.Lambda表达式初体验 3.Lambda的语法规则 3.1 Lambda练习1 3.1 Lambda练习2 4.Lambda表达式的原理 ...
最新文章
- linux下chmod使用
- hdu1.3.8 As Easy As A+B
- 八十、React中的容器组件和无状态组件
- 【QuotationTool】主要数据结构
- 从零开始学Node.js(二)
- 解决IIS7.5及以后中URL文件名有加号或空格导致显示404错误的问题
- HTML5+CSS3 Pink老师课后作业——小米logo过渡切换的实现
- cocos2dx 显示html,cocos2dx - 在游戏中显示HTML页面
- get/post在线接口
- SpringBoot的yml配置文件(三)
- 切!原来进入500强就那么简单啊——前IBM,HP,Dell员工揭开外企的招聘内幕
- mixamo_Mixamo的动画商店插件现在支持Mecanim!
- 云服务器php上传文件大小,php 上传远程服务器文件大小
- Android手机听筒和扬声器切换
- 程序员的“荣”与“耻”之我见
- 万能码码上付给你一个惊喜(安全扫码专业委员会)
- 如何在本地磁盘安装PE系统
- 简单的手机抓包软件(小黄鸟)HttpCanary
- 【Code pratice】—— 纸牌三角形
- 生鲜企业为什么要使用蔬菜配送系统?