18 Java8新特性

合集下载

JAVA8十大新特性详解

JAVA8十大新特性详解

JAVA8 十大新特性详‎解本教程将Ja‎v a8的新特‎新逐一列出,并将使用简单‎的代码示例来‎指导你如何使‎用默认接口方‎法,lambda‎表达式,方法引用以及‎多重A nno‎t ation‎,之后你将会学‎到最新的A P‎I上的改进,比如流,函数式接口,Map以及全‎新的日期A P‎I“Jav a‎is‎still‎not‎dead—and people‎are starti‎n g to figure‎that‎out.”本教程将用带‎注释的简单代‎码来描述新特‎性,你将看不到大‎片吓人的文字‎。

一、接口的默认方‎法Java 8允许我们给‎接口添加一个‎非抽象的方法‎实现,只需要使用 defaul‎t关键字即可‎,这个特征又叫‎做扩展方法,示例如下:复制代码代码‎如下:interf‎a ce F ormul‎a {double‎calcul‎a te(int a);defaul‎t double‎sqrt(int a) {return‎Math.sqrt(a);}}F ormul‎a接口在拥有‎c alcul‎a te方法之‎外同时还定义‎了sqrt方‎法,实现了F or‎m ula接口‎的子类只需要‎实现一个ca‎l culat‎e方法,默认方法sq‎r t将在子类‎上可以直接使‎用。

复制代码代码‎如下:F ormul‎a formul‎a = new F ormul‎a() {@O v erri‎d epublic‎double‎calcul‎a te(int a) {return‎sqrt(a * 100);}};formul‎a.calcul‎a te(100); // 100.0formul‎a.sqrt(16); // 4.0文中的for‎m ula被实‎现为一个匿名‎类的实例,该代码非常容‎易理解,6行代码实现‎了计算sqrt(a * 100)。

在下一节中,我们将会看到‎实现单方法接‎口的更简单的‎做法。

Java8新特性_Stream_归约、收集、分组、分区

Java8新特性_Stream_归约、收集、分组、分区

Java8新特性_Stream_归约、收集、分组、分区1、归约、收集、分组、分区1、归约reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以将流中元素反复结合起来,得到⼀个值。

2、收集collect——将流转换为其他形式。

接收⼀个 Collector接⼝的实现,⽤于给Stream中元素做汇总的⽅法3、分组及多级分组 Collectors.groupingBy()4、分区 Collectors.partitioningBy()2、源码package com.atguigu.java8;import java.util.Arrays;import java.util.DoubleSummaryStatistics;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Optional;import java.util.Set;import java.util.stream.Collectors;import org.junit.Test;import com.atguigu.java8.Employee.Status;public class TestStreamAPI3 {List<Employee> emps = Arrays.asList(new Employee(102, "李四", 79, 6666.66, Status.BUSY),new Employee(101, "张三", 18, 9999.99, Status.FREE),new Employee(103, "王五", 28, 3333.33, Status.VOCATION),new Employee(104, "赵六", 8, 7777.77, Status.BUSY),new Employee(104, "赵六", 8, 7777.77, Status.FREE),new Employee(104, "赵六", 8, 7777.77, Status.FREE),new Employee(105, "⽥七", 38, 5555.55, Status.BUSY));//3. 终⽌操作/*归约reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以将流中元素反复结合起来,得到⼀个值。

Java 8 新特性概述

Java 8 新特性概述

Java 8 新特性概述函数式接口Java 8 引入的一个核心概念是函数式接口(Functional Interfaces)。

通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行。

如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。

同时,引入了一个新的注解:@FunctionalInterface。

可以把他它放在一个接口前,表示这个接口是一个函数式接口。

这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解@FunctionalInterface 进行声明。

在接口中添加了@FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。

ng.Runnable 就是一个函数式接口。

[java] view plain copy print?在CODE上查看代码片派生到我的代码片@FunctionalInterfacepublic interface Runnable {public abstract void run();}Lambda 表达式函数式接口的重要属性是:我们能够使用Lambda 实例化它们,Lambda 表达式让你能够将函数作为方法参数,或者将代码作为数据对待。

Lambda 表达式的引入给开发者带来了不少优点:在Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核CPU 的优势,更易于为多核处理器编写代码;Lambda 表达式由三个部分组成:第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;第二部分为一个箭头符号:->;第三部分为方法体,可以是表达式和代码块。

语法如下:1. 方法体为表达式,该表达式的值作为返回值返回。

Java8新特性:Lambda、Stream和日期处理

Java8新特性:Lambda、Stream和日期处理

Java8新特性:Lambda、Stream和⽇期处理1. Lambda简介 Lambda表达式(Lambda Expression)是匿名函数,Lambda表达式基于数学中的λ演算得名,对应于其中的Lambda抽象(Lambda Abstraction),它是⼀个匿名函数,即没有函数名的函数。

⽰例import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import org.junit.Test;/*** 测试Java8 Lambda** @author CL**/public class TestLambda {/*** 遍历*/@Test@SuppressWarnings("serial")public void print() {// 1. 遍历ListList<Integer> list = new ArrayList<Integer>() {{add(1);add(2);add(3);}};list.forEach(n -> {System.out.println(n);});System.out.println("------------");list.forEach(System.out::println);System.out.println("------------");// 2. 遍历SetSet<Integer> set = new HashSet<Integer>() {{add(1);add(2);add(3);}};set.forEach(n -> {System.out.println(n);});System.out.println("------------");set.forEach(System.out::println);System.out.println("------------");// 3. 遍历MapMap<String, Object> map = new HashMap<String, Object>() {{put("id", 1);put("name", "张三");put("age", 18);}};map.forEach((k, v) -> {System.out.println(k + " -> " + v);}/*** 创建线程*/@Testpublic void create() {Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("r1");}};r1.run();System.out.println("------------");Runnable r2 = () -> {System.out.println("r2");};r2.run();}}2. Stream简介 Stream使⽤⼀种类似于SQL语句⽅式来提供对Java集合运算和表达的抽象。

Java8新特性(拉姆达表达式lambda)

Java8新特性(拉姆达表达式lambda)

Java8新特性(拉姆达表达式lambda)⼀、函数式接⼝ 函数式接⼝(functional interface 也叫功能性接⼝,其实是同⼀个东西)。

简单来说,函数式接⼝是只包含⼀个⽅法的接⼝。

⽐如Java 标准库中的ng.Runnable和 parator都是典型的函数式接⼝。

Java 8提供 @FunctionalInterface作为注解,这个注解是⾮必须的,只要接⼝符合函数式接⼝的标准(即只包含⼀个⽅法的接⼝),虚拟机会⾃动判断,但最好在接⼝上使⽤注解@FunctionalInterface进⾏声明,以免团队的其他⼈员错误地往接⼝中添加新的⽅法。

Java中的lambda⽆法单独出现,它需要⼀个函数式接⼝来盛放,lambda表达式⽅法体其实就是函数接⼝的实现. 下⾯的接⼝就是⼀个函数式接⼝1//添加此注解后,接⼝中只能有⼀个⽅法。

2 @FunctionalInterface3public interface A {4void call();5 }⼆、lambda语法 包含三部分: 1、⼀个括号内⽤逗号分隔的形式参数,参数是函数式接⼝⾥⾯⽅法的参数 2、⼀个箭头符号:-> 3、⽅法体,可以是表达式和代码块。

1 (parameters) -> expression 或者 (parameters) -> { statements; } 通过下⾯的代码可以看到lambda表达式设计的代码更简洁,⽽且可读性更好。

1public class Demo1 {2public static void main(String[] args) {3 runThreadByLambda();4 runThreadByInnerClass();5 }67public static void runThreadByLambda() {8/*9 Runnable就是⼀个函数式接⼝:他只有⼀个⽅法run()⽅法。

java8新特性

java8新特性

Java 8的八个新特性1、接口的默认方法和静态方法Java 8在接口方面引入了新特性。

Java 8版之前,接口只有抽象方法,而在Java 8,为接口新增了两种类型的方法。

第一种是默认方法。

此方法使用了default关键字修饰方法名。

实际上接口不包含任何实现的方法,而在Java 8中,可以通过使用default关键字来添加默认的方法实现。

接口的实现类可以直接使用这些默认的方法,同时还可以重写默认的方法,这不是强制性的重写。

package demo.ch;public interface Java8InterfaceDemo {abstract void add();default void display(){System.out.println("default method of interface");}}Java 8接口引入的第二种方法是静态方法。

这一点与类中的静态方法相似,可以在接口中使用static关键字定义静态方法。

如果我们要调用接口定义的静态方法,只需使用接口名就可以访问这些静态方法。

比如:package demo.ch;public interface Java8InterfaceDemo {abstract void add();default void display(){System.out.println("default method of interface");}public static void show(){System.out.println("static method of interface");}}2、Lambda表达式Java 8中最令人激动的特性就是Lambda表达式,它能够把函数/动作作为参数传递给方法。

package demo.ch;import java.util.Arrays;public class JavalamdaExpression {public static void main(String[] args) {Arrays.asList("j", "a", "v", "a","8").forEach(e->System.out.print(e));}}3、java.util.Optional类Java 8在java.util包中新增了Optional类,Optional类是一个可以包含或不可以包含非空值的容器对象。

Java8新特性:list.stream().map().collect()

Java8新特性:list.stream().map().collect()

Java8新特性:list.stream().map().collect()StreamStream(流)是⼀个来⾃数据源的元素队列并⽀持聚合操作;mapmap ⽅法⽤于映射每个元素到对应的结果;CollectorsCollectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。

Collectors 可⽤于返回列表或字符串。

使⽤⽅式:1.⾸先创建⼀个实体类,添加部分属性;public class Student {public Student(String name,Integer age){=name;this.age=age;}private String name;private Integer age;public String getName() {return name;}public void setName(String name) { = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "name="+getName()+", age="+getAge();}}2. 新建实体集合并添加⼏条数据;List<Student> list = new ArrayList<>();list.add(new Student("ymw", 30));list.add(new Student("yh", 30));返回结果:[name=ymw, age=30, name=yh, age=30]3. 清空某个属性的值并返回结果:list.stream().map(it ->{it.setName("");return it;}).collect(Collectors.toList());System.out.println(list.toString());返回结果:[name=, age=30, name=, age=30]4. 获取其中某个属性的集合:List collection = list.stream().map(Student::getAge).collect(Collectors.toList());System.out.println(collection.toString());返回结果:[30, 30]。

JAVA8十大新特性详解

JAVA8十大新特性详解

JAVA8 十大新特性详解本教程将Java8的新特新一一列出,并将利用简单的代码例如来指导你如何利用默许接口方式,lambda表达式,方式引用和多重Annotation,以后你将会学到最新的API上的改良,比如流,函数式接口,Map和全新的日期API“Java is still not dead—and people are starting to figure that out.”本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字。

一、接口的默许方式Java 8许诺咱们给接口添加一个非抽象的方式实现,只需要利用 default关键字即可,那个特点又叫做扩展方式,例如如下:default double sqrt(int a) {return Math.sqrt(a);}}Formula接口在拥有calculate方式之外同时还概念了sqrt方式,实现了Formula接口的子类只需要实现一个calculate方式,默许方式sqrt将在子类上能够直接利用。

formula.calculate(100); // 100.0formula.sqrt(16);文中的formula被实现为一个匿名类的实例,该代码超级容易明白得,6行代码实现了计算sqrt(a * 100)。

在下一节中,咱们将会看到实现单方式接口的更简单的做法。

译者注:在Java中只有单继承,若是要让一个类给予新的特性,一般是利用接口来实现,在C++中支持多继承,许诺一个子类同时具有多个父类的接口与功能,在其他语言中,让一个类同时具有其他的可复用代码的方式叫做mixin。

新的Java 8 的那个特新在编译器实现的角度上来讲加倍接近Scala的trait。

在C#中也出名为扩展方式的概念,许诺给已存在的类型扩展方式,和Java 8的那个在语义上有不同。

二、Lambda 表达式第一看看在老版本的Java中是如何排列字符串的:Collections.sort(names, new Comparator<String>() {@Overridepublic int compare(String a, String b) {return bpareTo(a);}});只需要给静态方式 Collections.sort 传入一个List对象和一个比较器来按指定顺序排列。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 创建:
• 新建一个流。
• 2 中间操作:
• 在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作。
• 3 终止操作:
• 使用一个终止操作来产生一个结果。该操作会强制之前的延迟操作立即执行,在此之后, 该Stream就不能使用了。
创建Stream
• 通过Collection对象的stream()或parallelStream()方法。
• 支持Lambda表达式 • 函数式接口 • 新的Stream API • 新的日期 API • 其他特性
Lambda表达式
• Lambda表达式:特殊的匿名内部类,语法更简洁。
• Lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传 递),将代码像数据一样传递。
• 基本语法:
<函数式接口> <变量名> = (参数1,参数2...) -> { //方法体
Java8 新特性
Java Platform Enterprise Edition
CONTENTS
1 ITEMS Java8概述 3 ITEMS 函数式接口 5 ITEMS Stream API
2 ITEMS Lambda表达式
4 ITEMS
方法引用
6 ITEMS 新时间API
Java8概述
• Java8 (又称 JKD1.8) 是 Java 语言开发的一个主要版本。 • Oracle公司于2014年3月18日发布Java8 。
同时省略return,且执行语句也保证只有一句。 • Lambda不会生成一个单独的内部类文件。
函数式接口
• 如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口 可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上 。
• @FunctionalInterface 注解检测接口是否符合函数式接口。
};
Lambda表达式
• Lambda引入了新的操作符:->(箭头操作符),->将表达式分成两部分
• 左侧:(参数1,参数2…)表示参数列表 • 右侧:{}内部是方法体
• 注意事项:
• 形参列表的数据类型会自动推断。 • 如果形参列表为空,只需保留() 。 • 如果形参只有1个,()可以省略,只需要参数的名称即可。 • 如果执行语句只有一句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须
• 常见形式
• 对象::实例方法 • 类::静态方法 • 类::实例方法 • 类::new
什么是Stream
• 流(Stream)与集合类似,但集合中保存的是数据,而Stream中保存对集 合或数组数据的操作。
原料
工序
工序
工序

1
2
n

Stream
Stream特点
• Stream 自己不会存储元素。 • Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。 • Stream 操作是延迟执行的,会等到需要结果的时候才执行。
• 终止操作:
• forEach、min、max、count • reduce、collect
新时间API
• 之前时间API存在问题:线程安全问题、设计混乱。 • 本地化日期时间 API:
• LocalDate • LocalTime • LocalDateTime
• Instant:时间戳、瞬间。 • ZoneId:时区。 • Date、Instant、LocalDateTime的转换。 • DateTimeFormatter:格式化类。
• 通过Arrays类的stream()方法。
• 通过Stream接口的of()、iterate()、generate()方法。
• 通过IntStream、LongStream、DoubleStream接口中的of、range、 rangeClosed方法。
中间操作、终止操作
• 中间操作:
• filter、limit、skip、distinct、sorted • map • parallel
常见函数式接口
函数式接口
Consumer<T> 消费型接口 Supplier<T> 供给型接口
Function<T,R> 函数型接口
Predicate<T> 断言型接口
参数类型 返回类型
说明
T
void void accept(T t);对类型为T的对象应用操作

T
T get(); 返回类型为T的对象
T
R
R apply(T t);对类型为T的对象应用操作,并返回类 型为R类型的对象。
T
boolean
boolean test(T t);确定类型为T的对象是否满足条件, 并返回boolean类型。
方法引用(了解)
• 方法引用是Lambda表达式的一种简写形式。 如果Lambda表达式方法体中 只是调用一个特定的已经存在的方法,则可以使用方法引用。
总结
• Lambda表达式:
• 允许把函数作为一个方法的参数传递。
• 函数式接口:
• Consumer • Supplier • Function • Predicate
• Stream API:
• 把对数据的操作封装成一个流。 • 步骤:创建、中间操作、终止操作。
• 新时间API
THANK YOU
相关文档
最新文档