一、JDK1.8新特性
1.1、Lambda表达式
1、什么是Lambda表达式&函数式接口
Lambda表达式:可以理解为一种匿名函数的代替,Lambda允许将函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递,目的就是简化代码的编写。
2、什么是函数式接口
Lambda表达式需要函数式接口的支持,所谓函数式接口,是指只有一个抽象方法。
另外JDK1.8也提供了一个注解,帮助我们编译时检查语法是否符合。@Functioninterface
3、Lambda表达式基本语法
函数式接口 变量名=(参数1,参数2,…)->{
//方法体
}
4、Lambda表达式注意事项
Lambda表达式引入新的操作符:->(箭头操作符号),->将表达式分成两部分
左侧:(参数1,参数2,…)表示参数列表
右侧:{}内部是方法体
(1)形参列表的数据类型会自动推断
(2)如果形参列表为空,只需要保留()
(3)如果形参只有一个,()可以省略,只需要参数的名称即可
(4)如果执行语句只有一句,且无返回值,{}可以省略,若有返回值,若想省去{},则必须同时省略return,且执行语句也保证只有1句
(5)Lambda表达式不会生成一个单独的内部类文件
(6)Lambda表达式若访问局部变量,则局部变量必须是final的,若是局部变量没有添加final关键字,系统会自定添加,此后再修改该局部变量,会报错
package day11;
/*
* 这个类用来演示JDK1.8提供的Lambda表达式
* Lambda表达式就是用来简化代码
* 基于函数式接口来使用
*/
public class Demo02 {
public static void main(String[] args) {
//使用匿名内部类的方式创建线程
Runnable r=new Runnable() {
public void run() {
for(int i=0;i<5;i++) {
System.out.println(i);
}
}
};
Thread t=new Thread() {
public void run() {
for(int i=0;i<10;i++) {
System.out.println("成功源于失败");
}
}
};
Thread tt=new Thread(r);
t.start();
tt.start();
//使用Lambda表达式来创建线程任务
//Lambda表达式不关注怎么去做,而是关注要做什么
Runnable rr=()->{
for(int i=0;i<6;i++) {
System.out.println(i);
}
};
Thread t2=new Thread(rr);
t2.start();
}
}
package day11;
/**
* 练习Lambda表达式
* @author lenovo
*
*/
public class Demo03 {
public static void main(String[] args) {
// //Lambda代替匿名内部类
// A a=()->{
// System.out.println("求和");
// };
// //只有一句代码的时候可以省略大括号
// //A a=()->System.out.println("求和");
// a.sum();
//
//当有返回值时,方法一
A a1=(a,b)->{
return a+b;
};
// //方法二
// A a1=(a,b)->a+b
int s=a1.sum(20, 50);
System.out.println(s);
}
}
1.2、函数式接口
JDK1.8提供的新特性包含:函数式接口
接口中只要符合一个就是函数式接口,要求是:接口中有且只有一个抽象方法。
函数式接口中,可以包含默认方法和静态方法。
一般函数式接口用来支持Lambda表达式的使用。
一般会在函数式接口中使用@FunctionalInterface注解。标志这个接口是函数式接口,即使不使用注解标志,只要符合函数式接口的条件也是函数式接口
1.3、流式编程Stream API
什么是Stream?
Stream是JAVA8中处理数组、集合的抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作,使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据查询。
一个Stream表面上与一个集合很类似,集合中保存的数据,而流设置的是对数据的操作。
Stream的特点:
(1)Stream自己不会存储元素
(2)Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream。
(3)Stream操作时延迟执行的,这意味着他们会等到需要结果的时候才执行。
注:Stream遵循“做什么,而不是怎么去做”的原则,只需要描述需要做什么,而不是考虑程序是怎么实现的。
package day11;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
/**
* Stream是JDK1.8提出的新特性
* 主要用于对数组或者是集合进行简化操作
* @author lenovo
*
*/
public class Demo04 {
public static void main(String[] args) {
//集合的每一个元素都是引用类型
//使用泛型目的就是规定集合中每一个元素的数据类型,减少数据类型
//强转操作
List<String> list=new ArrayList<>();
list.add("张三丰");
list.add("周芷若");
list.add("李四");
list.add("张国");
//要求将集合中的字符长度==3的数据取出来
//并且统计长度为3的元素有几个
int count=0;//计数变量
for(String s:list) {
if(s.length()==3) {
System.out.println(s);
count++;
}
}
System.out.println("元素长度为3的个数:"+count);
//使用 Stream提供的API
Stream<String> stream=list.stream();
//过滤
//stream.filter((a)->a.length()==3).forEach((c)->System.out.println(c));
long count1=stream.filter((a)->a.length()==3).count();
System.out.println(count1);
list.stream().forEach((c)->System.out.println(c));
}
}
测试:
1.4、接口的默认方法与静态方法
之前讲到的接口中的方法都是抽象方法,变量都是常量。但是在JDK1.8提出接口的默认方法和静态方法,目的就是在实现类中,可以根据需求来重写接口的默认方法。
在接口中使用default关键字定义默认方法,该方法含有方法体。
1.5、新时间日期API
1、日期创建
package day11;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.DateTimeFormatter;
/**
* Date:表示的当前的系统时间,这个类中有很多的方法多是过期的
* @author lenovo
* JDK1.8提供了时间的操作的类:
* LocalDate表示 年月日
* LocalTime表示 时分秒
* LocalDateTime表示 年月日 时分秒
*
*/
public class Demo05 {
public static void main(String[] args) {
//获取日期
LocalDate of=LocalDate.of(2020,04,14);
System.out.println(of);
/*Date d=new Date();
* System.out.println(d);*/
LocalDate of1=LocalDate.of(2020, Month.FEBRUARY, 20);
System.out.println(of1);
LocalDate parse=LocalDate.parse("2020-04-14");
System.out.println(parse);
LocalDate parse1=LocalDate.parse("2020-04-10",DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(parse1);
}
}
测试:
2、时间创建
package day11;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Demo06 {
public static void main(String[] args) {
// TODO Auto-generated method stub
LocalTime of=LocalTime.of(10,20);
System.out.println(of);
LocalTime parse=LocalTime.parse("10:20:20");
System.out.println(parse);
LocalTime parse1=LocalTime.parse("20/20/20",DateTimeFormatter.ofPattern("HH/mm/ss"));
System.out.println(parse1);
LocalTime localTime=LocalTime.now();
System.out.println(localTime);
}
}
测试:
3、时间日期创建
这里有一点小问题还没搞明白,回头补上
4、取时间值
package day11;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
public class Demo08 {
public static void main(String[] args) {
LocalDate now=LocalDate.now();
Month month=now.getMonth();//英文字母月份
System.out.println(month);
int value=now.getMonthValue();//数字的月份
System.out.println(value);
DayOfWeek dayOfWeek=now.getDayOfWeek();
System.out.println(dayOfWeek);
int dayOfMonth=now.getDayOfMonth();
System.out.println(dayOfMonth);
}
}
测试: