java8新特性学习1
java8增加了不少新特性,下面就一些常见的新特性进行学习。。。
1、接口中的方法
2、函数式接口
3、Lambda表达式
4、java8内置的四大核心函数式接口
5、方法引用和构造器引用
6、Stream API
7、并行流和串行流
8、Optional 类
9、新的时间与日期API
一:接口中的方法
在之前,接口中的方法都是抽象方法,默认被public abstract修饰,没有方法体。接口中的成员变量都是常量。
(1)接口中的静态方法
package com.bjsxt.testInterface; import sun.plugin2.os.windows.FLASHWINFO; /**
* Created by Administrator on 2019/3/5.
* 接口中使用static修饰的方法必须有方法体
* 接口中使用static修饰的方法只能被接口本身调用。 接口名.方法名(...)
* 接口中的static方法不能被子接口继承
* 接口中的static方法不能被实现类重写或者直接调用
*/
public interface Fly { //接口中的抽象方法
void air(); //接口中的静态方法,有方法体
static void wings(){
System.out.println("有翅膀。。。。。可以飞");
} } interface FlyChildren extends Fly{ } class Bird implements Fly{
@Override
public void air() {
System.out.println("鸟飞翔需要空气。。。");
} } class Test{
public static void main(String[] args){
Fly.wings(); //接口调用接口中的静态方法
FlyChildren.wings(); //报错,无法调用
Bird bird=new Bird();
bird.wings(); //报错,无法调用
}
}
(2)接口中default修饰的方法
注意:接口默认方法的”类优先”原则
若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突
package com.bjsxt.testInterface; import sun.plugin2.os.windows.FLASHWINFO; /**
* Created by Administrator on 2019/3/5.
* 接口中使用default修饰的方法必须有方法体
* 接口中使用default修饰的方法不能被接口本身调用。
* 接口中的default方法可以被子接口继承
* 接口中的default方法可以被实现类重写或者直接调用
*/
public interface Fly { //接口中的抽象方法
void air(); //接口中default修饰的方法,有方法体
default void wings(){
System.out.println("有翅膀。。。。。可以飞");
} } interface FlyChildren extends Fly{ } class Bird implements Fly{
@Override
public void air() {
System.out.println("鸟飞翔需要空气。。。");
} // @Override
// public void wings() {
// System.out.println("鸟儿有翅膀,可以飞......");
// }
} class Test{
public static void main(String[] args){
Bird bird=new Bird();
bird.wings(); //此时调用的是接口中的方法
}
}
二:函数式接口
有且仅有一个抽象方法,但是可以有很多个非抽象方法的接口就是函数式接口,函数式接口可以被隐式转换为lambda表达式,函数式接口上面可以加个
@FunctionalInterface注解
@FunctionalInterface
public interface Fly { //接口中的抽象方法
void air(); //接口中default修饰的方法,有方法体
default void wings(){
System.out.println("有翅膀。。。。。可以飞");
}
}
三、Lambda表达式
Lambda 表达式需要“函数式接口”的支持(感觉就是对匿名内部类的简化)
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰可以检查是否是函数式接口
Lambda 表达式的基础语法:Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体
package com.bjsxt.testInterface; /**
* Created by Administrator on 2019/3/5.
*/
public interface TestInterface { int sum(int num1,int num2);
} class Test{
public static void main(String[] args){
test3();
} public static void test1(){
//使用匿名内部类的写法
TestInterface testInterface=new TestInterface() {
@Override
public int sum(int num1, int num2) {
return num1+num2;
}
};
System.out.println(testInterface.sum(10,20));
} public static void test2(){
//lambda写法1,常规写法
TestInterface testInterface=(int num1, int num2)->{
return num1+num2;
};
System.out.println(testInterface.sum(10,20));
} public static void test3(){
/*
* lambda写法2,简略写法
* 形参的数据类型可以省略掉,jvm虚拟机会根据上下文自动推断(类型推断),如果只有一个参数()也可以省略掉
* 如果方法体中的代码只有一行,{}可以省略掉,如果是return返回数据的,return也可以省略掉
**/ TestInterface testInterface=(num1, num2)->num1+num2;
System.out.println(testInterface.sum(10,20));
}
}
案例:
package com.bjsxt.lambda; /**
* Created by Administrator on 2019/3/6.
* 函数式接口
*/
@FunctionalInterface
public interface MyFunction { Integer getValue(Integer num);
}
package com.bjsxt.lambda; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; /**
* Created by Administrator on 2019/3/6.
*/
public class TestLambda01 { public static void main(String[] args){
int aa=test1(100,(num)->{return num*num;});
} public static Integer test1(Integer num,MyFunction myFunction){
return myFunction.getValue(num);
} }
四、java8内置的四大核心函数式接口
Java8 内置的四大核心函数式接口
Consumer<T> : 消费型接口
void accept(T t); //抽象方法
Supplier<T> : 供给型接口
T get(); //抽象方法
Function<T, R> : 函数型接口
R apply(T t); //抽象方法
Predicate<T> : 断言型接口
boolean test(T t); //抽象方法
package com.bjsxt.lambda; import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier; /**
* Java8 内置的四大核心函数式接口
*
* Consumer<T> : 消费型接口
* void accept(T t);
*
* Supplier<T> : 供给型接口
* T get();
*
* Function<T, R> : 函数型接口
* R apply(T t);
*
* Predicate<T> : 断言型接口
* boolean test(T t);
*/
public class TestLambda02 { public static void main(String[] args){ test1("helloWorld",str->System.out.println(str)); List list=test2(()->(int)(Math.random()*100));
list.forEach(System.out::print); } /**
* 测试消费型接口
* @param str
*/
public static void test1(String str,Consumer<String> consumer){
consumer.accept(str);
} /**
* 测试供给型接口
*/
public static List<Integer> test2(Supplier<Integer> supplier){
List<Integer> list=new ArrayList<>();
for(int i=0;i<10;i++){
list.add(supplier.get());
}
return list;
} }
其他两个接口也是同样,不再测试,还有其他一些内置的子接口,都是同样的用法
五、方法引用和构造器引用
package com.bjsxt.lambda; import java.io.PrintStream;
import java.util.function.*; /**
* 一、方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用
* (可以将方法引用理解为 Lambda 表达式的另外一种表现形式)
* 1. 对象的引用 :: 实例方法名
* 2. 类名 :: 静态方法名
* 3. 类名 :: 实例方法名
* 注意:
* ①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
* ②若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式:类名 :: 实例方法名
*
* 二、构造器引用 :构造器的参数列表,需要与函数式接口中参数列表保持一致!
* 1. 类名 :: new
*
* 三、数组引用
* 类型[] :: new;
*/
public class TestLambda03 { public static void main(String[] args){
// test1(); test2();
} /**
* 方法引用
* 对象的引用 :: 实例方法名
*/
public static void test1(){
Consumer<String> consumer=str->System.out.println(str); //原来的写法
consumer.accept("hello world");
PrintStream ps=System.out;
Consumer<String> consumer1=ps::println; //现在写法
consumer1.accept("hello world2"); System.out.println("---------------------------------------"); Student stu=new Student(1,"段然涛",24);
Supplier<String> supplier=()->stu.getName(); //原来写法
System.out.println(supplier.get()); Supplier<String> supplier2=stu::getName; //现在写法
System.out.println(supplier.get());
} /**
* 方法引用
* 类名 :: 静态方法名
*/
public static void test2(){
BiFunction<Integer,Integer,Integer> biFunction=(x,y)->Math.max(x,y); //以前的写法
System.out.println(biFunction.apply(3,4)); BiFunction<Integer,Integer,Integer> biFunction2=Math::max; //现在的写法
System.out.println(biFunction2.apply(6,5));
} /**
* 方法引用
* 类名 :: 实例方法名
*/
public static void test3(){
BiPredicate<String, String> bp = (x, y) -> x.equals(y); //以前写法
System.out.println(bp.test("abx","abx"));
BiPredicate<String, String> bp2=String::equals; //现在写法
System.out.println(bp.test("abx","abx"));
} /**
* 构造器引用
* 类名 :: new
*/
public static void test4(){
Supplier<Student> supplier=()->new Student(2,"李飞宇",34); //以前写法
System.out.println(supplier.get());
Supplier<Student> supplier2=Student::new; //现在写法,用的是无参的构造函数,因为该函数式接口里面的抽象方法是无参的
System.out.println(supplier.get()); BiFunction<Integer,String,Student> biFunction=Student::new; //用的是两个参数的构造函数
System.out.println(biFunction.apply(3,"阿飞")); } /**
* 数组引用
* 类型[] :: new;
*/
public static void test5(){
Function<Integer,String[]> function=(num)->new String[num]; //以前的写法
System.out.println(function.apply(10)); Function<Integer,String[]> function2=String[]::new; //现在写法
System.out.println(function2.apply(10)); }
} class Student{
public int id; public String name; public int age; public Student() { } public Student(int id, String name) {
this.id = id;
this.name = name;
} public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}
java8新特性学习1的更多相关文章
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- java8 新特性学习笔记
Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...
- java8新特性学习:函数式接口
本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...
- java8新特性学习:stream与lambda
Streams api 对 Stream 的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect). 流的操作类型分为两种: Int ...
- Java8 新特性学习
摘自:https://blog.csdn.net/shuaicihai/article/details/72615495 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda ...
- java8新特性学习2
六.Stream API Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*).Stream 是 Java8 中 ...
- java8新特性学习笔记(二) 使用流(各种API)
筛选和切片 用谓词筛选,筛选出各个不相同的元素,忽略流中的头几个元素,或将流截断至指定长度 用谓词筛选 Stream接口支持filter方法,该操作接受一个谓词(返回一个boolean的函数) 作为参 ...
- java8新特性学习笔记(二) 流的相关思想
流是什么 流是Java API的新成员,他允许你以声明的方式处理数据集合,就现在来说,可以把他们看成遍历数据集合的高级迭代器.此外,流还可以透明地并行处理,你无须写任何多线程代码. 下面例子是新老AP ...
- Java8新特性学习笔记(一) Lambda表达式
没有用Lambda表达式的写法: Comparator<Transaction> byYear = new Comparator<Transaction>() { @Overr ...
随机推荐
- [转]Asp.net Core 使用Redis存储Session
本文转自:http://www.cnblogs.com/hantianwei/p/5723959.html 前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储 ...
- 11、幻灯片:Slides
/* ---ts----*/ import { Page,Slides } from 'ionic-angular'; import { ViewChild } from '@angular/core ...
- tornado基本使用【服务】
1.安装 2.请求处理程序和请求参数 1.安装 pip install tornado 2.请求处理程序和请求参数 Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornad ...
- js图片上传并预览
<form id="addpic" class="easyui-form" method="post" enctype="m ...
- ubuntu 14.04 64bit 安装 oracle 11g r2
参考文章:http://tutorialforlinux.com/2016/03/09/how-to-install-oracle-11g-r2-database-on-ubuntu-14-04-tr ...
- DOM 和 BOM
DOM 和 BOM DOM: DOM= Document Object Model,文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构.换句话说,这是表示和处理一个H ...
- Python中and和or的运算法则
1. 在纯and语句中,如果每一个表达式都不是假的话,那么返回最后一个,因为需要一直匹配直到最后一个.如果有一个是假,那么返回假2. 在纯or语句中,只要有一个表达式不是假的话,那么就返回这个表达式的 ...
- Spring MVC 参数必填项导致客户端报 HTTP 400 并且无法进入断点的问题
1.问题 Spring MVC 在参数上设置了必填项,post 请求时报 HTTP 400 并且未进入断点,如将“年龄”设置为了必填项: @RequestParam( value="age& ...
- github使用手册
1.git init 2.git add README.md (增加文件夹/文件:git add dir/files) 3.git commit -m "注释内容” 4.git push - ...
- Zepto结合Swiper的选项卡
我们昨天说了关于Angular的选项卡,那今天就说一下Swiper的选项卡吧! 今天的选项卡是Zepto结合Swiper的选项卡,咱么明天再说纯纯的Swiper的吧! 既然是关于Zepto和Swipe ...