课程概要:
1、Java8概述
2、下载jdk 1.8
3、安装jdk 1.8
4、配置环境变量
5、在Eclipse中使用jdk 1.8
6、lambda
6.1 lambda概述
6.2 lambda案例(上)
6.3 lambda案例(下)
7、Stream类
8、过滤器案例
9、DoubleStream接口
10、日期类-LocalDate类
11、时间类LocalTime
12、日期时间类-LocalDateTime
13、DateTimeFormatter类-解析字符串为日期
14、ZoneDateTime类:格式化日期为字符串
1、Java 8概述
一、Java 8版本
- oracle公司于2014年3月27日正式推出Java 8
- Java SE 8
- Java ME 8
- Java Embedded 8
二、Java SE8 的重要性能包括:
1、Lambda
2、Nashorn JavaScript引擎
3、新的日期与时间API
4、一套简洁的配置文件
5、从JVM中去除了“永久代(permanent generation)”
6、增强的注解功能
三、Java SE Embedded 8
1、Java SE Embedded 8 为嵌入式及物联网设备提供了一个开发平台,具备Java SE 8 的灵活性、可移植性和功能。
2、Java SE Embedded 8使开发人员能够使用Java SE 8为嵌入式设备建立更小的平台。
四、Java ME 8
1、与Java SE 8一致的Java语言和API
2、支持最新的Web协议
3、全面的应用模型
4、先进的安全功能
5、用于电源管理及多种标准外部设备交互的标准API
2、下载jdk 1.8
jdk下载官网网址:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
3、安装jdk 1.8
不要把jdk 1.8.0和jre1.8.0安装在一个文件夹下
4、配置环境变量
1、在系统变量中设置JAVA_HOME变量
2、在用户变量中设置PATH变量
3、在用户变量中设置CLASS PATH变量
过程:
①系统变量→新建 JAVA_HOME 变量 。
变量值填写jdk的安装目录(本人是 C:\Java\jdk1.8.0)
②系统变量→寻找 Path 变量→编辑
在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)
③系统变量→新建 CLASSPATH 变量
变量值填写
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)
系统变量配置完毕。
在cmd下输入java -version 查看当前版本。
参考网址:
http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html
5、在Eclipse中使用JDK 8
Eclipse下载地址:http://www.eclipse.org/downloads/
6、lambda
6.1 lambda概述
课程概要:
lambda概述
为什么使用lambda?
lambda语法
一、lambda概述
表达了计算机中最基本的概念:调用和置换
二、为什么使用lambda
1、Java是面向对象的语言,不能像函数语言那样嵌套定义方法
2、Java的匿名内部只能存在于创建它的线程中,不能运行在多线程中,无法充分应用多核的硬件优势
3、匿名内部类的缺点还有:
1) 语法相对复杂
2) 在调用内部类的上下文中,指引和this的只带
3) 类加载和实例创建语法不可避免
4) 不能引用外部的非final对象
5) 不能抽象化控制流程
三、lambda语法
lambda的语法包括三部分
1、参数列表
2、符号箭头 "->"
3、代码块
6.2 lambda案例(上)
【案例】用lambda简化Runnable接口的实现方式
public class Test_lambda{
public static void main(String[] args){
new Runnable(){
public void run(){
System.out.println("Anonymous Runnable Interface");
}
}.run();
}
}
public class Test_lambda{
public static void main(String[] args){
new Runnable(){
//使用匿名内部类是无法使用外部变量的
//要使用必须改成常量
public void run(){
System.out.println("Anonymous Runnable Interface");
}
}.run();、
int i=1;
Runnable r=()->{
//lambda 可以使用外部变量
System.out.println("Use lambda to realize Runnable Interface");
//i++; 这样的语法是错误的,lambda不允许直接改变外部变量的值
System.out.println("i="+i);
};
r.run();
}
}
6.3 lambda案例(下)
【案例】lambda实现自定义接口,模拟登入操作
public class Test_lambda_01{
//使用匿名内部类实现
public static void main(String[] args){
new Action(){
public void execute(String content){
System.out.println(content);
}
}.execute("use anonymous inner class to realize entry before jdk 1.8");
}
// define one interface
static interface Action{
void execute(String content);
}
}
public class Test_lambda_01{
public static void main(String[] args){
new Action(){
public void execute(String content){
System.out.println(content);
}
}.execute("use anonymous inner class to realize entry before jdk 1.8");
//use lambda to realize entry
Action login=(String content)->{
System.out.println(content);
};
login.execute("use lambda to realize this function in jdk 1.8");
}
// define one interface
static interface Action{
// 定义一个方法execute
void execute(String content);
}
}
7、Stream 接口
课程概要:
什么是Stream
什么是管道
什么是过滤器
一 、什么是Stream
1、Stream在Java 8中被定义为泛型接口
2、Stream接口代表数据流
3、Stream不是一个数据结构,不直接存储数据
4、Stream通过管道操作数据
5、创建Stream接口实现类对象
stream():创建一个Stream接口实现类的对象。
例如:
//Person is a class defined by yourself
Stream stream=people.stream();
二、什么是管道
1、管道:代表一个操作序列
2、管道包含一下组件:
1) 数据集:可能是集合、数组等
2) 零个或多个中间业务。如过滤器
3) 一个终端操作,如forEach
三、什么是过滤器
1、过滤器:用给定的条件在源数据基础上过滤出新的数据,并返回一个Stream对象
2、过滤器包含匹配的谓词
例如:判断p对象是否是男性的lambda表达式
Stream stream=people.stream();
stream=stream.filter(p->p.getGender()=='男');
【案例】创建一个元素为Person类的集合:people
使用Stream和forEach显示该集合对所有元素
先创建Person.java,再创建Test_collection_stream.java
package java_study;
public class Person {
public static enum Sex{
MALE,FEMALE;
}
private String name;
private Sex gender;
private int age;
private double height;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Sex getGender() {
return gender;
}
public void setGender(Sex gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, Sex gender, int age, double height) {
super();
this.name = name;
this.gender = gender;
this.age = age;
this.height = height;
}
@Override
public String toString() {
return "Person [name=" + name + ", gender=" + gender + ", age=" + age + ", height=" + height + "]";
}
}
package java_study;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;;
public class Test_collection_stream {
public static void main(String[] args) {
List people=createPeople();//initialize the list
Stream stream=people.stream();
stream.forEach(
p->System.out.println(p.toString())
);
}
static List createPeople(){
List people=new ArrayList<>();
Person p=new Person("zhangfei",Person.Sex.MALE,33,1.99);
people.add(p);
p=new Person("huangfei",Person.Sex.FEMALE,32,1.71);
people.add(p);
p=new Person("wangfei",Person.Sex.FEMALE,31,1.69);
people.add(p);
p=new Person("lifei",Person.Sex.MALE,33,1.89);
people.add(p);
return people;
}
}
8、过滤器案例
【案例】创建一个元素为Person类的集合:people
Person [name="zhangfei", gender=FEMALE, age=32, height=1.69]
Person [name="lifei", gender=MALE, age=31, height=1.72]
依旧是先创建Person类
package java_study;
public class Person {
public static enum Sex{
MALE,FEMALE;
}
private String name;
private Sex gender;
private int age;
private double height;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Sex getGender() {
return gender;
}
public void setGender(Sex gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, Sex gender, int age, double height) {
super();
this.name = name;
this.gender = gender;
this.age = age;
this.height = height;
}
@Override
public String toString() {
return "Person [name=" + name + ", gender=" + gender + ", age=" + age + ", height=" + height + "]";
}
}
再创建Test_collection_fliter类
package java_study;
import java.util.ArrayList;
import java.util.List;
public class Test_collection_fliter {
public static void main(String[] args) {
List people=createPeople();//initialize the list
people.stream()
.filter(p->p.getGender()==Person.Sex.FEMALE)
.forEachOrdered(p->System.out.println(p.toString()));
}
static List createPeople(){
List people=new ArrayList<>();
Person p=new Person("zhangfei",Person.Sex.MALE,33,1.99);
people.add(p);
p=new Person("huangfei",Person.Sex.FEMALE,32,1.71);
people.add(p);
p=new Person("wangfei",Person.Sex.FEMALE,31,1.69);
people.add(p);
p=new Person("lifei",Person.Sex.MALE,33,1.89);
people.add(p);
return people;
}
}
9、DoubleStream接口
一、DoubleStream接口表示元素类型是double的数据源
二、DoubleStream接口的常用方法:
1、max().getAsDouble():获取流中数据集的最大值
2、stream.min().getAsDouble():获取流中数据集的最小值
3、stream.average():获取流中数据集的平均值
【案例】统计people集合中姓名包含"fei"的平均身高
package java_study;
public class Person {
public static enum Sex{
MALE,FEMALE;
}
private String name;
private Sex gender;
private int age;
private double height;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Sex getGender() {
return gender;
}
public void setGender(Sex gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, Sex gender, int age, double height) {
super();
this.name = name;
this.gender = gender;
this.age = age;
this.height = height;
}
@Override
public String toString() {
return "Person [name=" + name + ", gender=" + gender + ", age=" + age + ", height=" + height + "]";
}
}
package java_study;
import java.util.ArrayList;
import java.util.List;
public class Test_collection_doublestream {
public static void main(String[] args) {
List people=createPeople();//initialize the list
double avgHeight=people.stream()
.filter(p->p.getName().indexOf("fei")>=0)
.mapToDouble(p->p.getHeight())
.average()
.getAsDouble();
System.out.println("the average height of these guys whose name includes 'fei' is "+avgHeight);
}
static List createPeople(){
List people=new ArrayList<>();
Person p=new Person("zhangfi",Person.Sex.MALE,33,1.99);
people.add(p);
p=new Person("huangfei",Person.Sex.FEMALE,32,1.71);
people.add(p);
p=new Person("wangfei",Person.Sex.FEMALE,31,1.69);
people.add(p);
p=new Person("life",Person.Sex.MALE,33,1.89);
people.add(p);
return people;
}
}
10、LocalDate类
课程概要:
概述
常用方法
一、概述
LocalDate类使用ISO日历表示年、月、日
二、LocalDate类的常用方法:
1、LocalDate.now() :获取系统当前日期
2、LocalDate.of(int year, int month, int dayOfMonth) 按指定日期创建LocalDate对象
3、getYear():返回日期中的年份
4、getMonth():返回日期中的月份
5、getDayOfMonth():返回月份中的日
【案例】用LocalDate获取当前日期
package java_study;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class Test_LocalDate {
public static void main(String[] args){
LocalDate date = LocalDate.now();
System.out.print(date.getYear()+"年");
System.out.print(date.getMonthValue()+"月");
System.out.println(date.getDayOfMonth()+"日");
System.out.println(date.toString());
}
}
11、LocalTime类
课程概要:
概述
常用方法
一、概述
LocalTime类用于表示一天中的时间
二、LocalTime类的常用方法:
1、LocalTime.now():获取系统当前时间
2、LocalTime.of(int hour, int minute, int second)
按指定时间创建LocalTime对象
3、getHour():返回小时
4、getMinute():返回分钟
5、getSecond():返回秒
【案例】用LocalTime获取当前时间
package java_study;
import java.time.LocalTime;
public class Test_LocalTime {
public static void main(String[] args) {
LocalTime time=LocalTime.now();
System.out.print(time.getHour()+"时");
System.out.print(time.getMinute()+"分");
System.out.println(time.getSecond()+"秒");
System.out.println(time.toString());
}
}
12、LocalDateTime类
课程概要:
概述
常用方法
一、概述
LocalDateTime类用于表示日期和时间
二、LocalDateTime类的常用方法:
1、LocalDateTime.now():获取系统当前时间
2、LocalDateTime.of(int year, int month, int dayOfMonth)
按指定时间创建LocalDateTime对象
3、getYear():返回日期中的年份
4、getMonth():返回日期中的月份
5、getDayOfMonth():返回月份中的日
【案例】用LocalDateTime获取当前日期和时间
package java_study;
import java.time.LocalDateTime;
public class Test_LocalDateTime {
public static void main(String[] args) {
LocalDateTime date=LocalDateTime.now();
System.out.print(date.getYear()+"年");
System.out.print(date.getMonthValue()+"月");
System.out.println(date.getDayOfMonth()+"日");
System.out.print(date.getHour()+"时");
System.out.print(date.getMinute()+"分");
System.out.println(date.getSecond()+"秒");
System.out.println(date.toString());
}
}
13、DateTimeFormatter类
课程概要:
概述
常用方法
一、概述
DateTimeFormatter类用于将字符串解析为日期
二、常用方法
1、static ofPattern(String pattern);
作用:按pattern字符串指定的格式创建
DateTimeFormatter对象
2、LocalDateTime.parse(strDate, formatter);
【案例】将字符串"2014-04-01:13:24:01"格式化为一个LocalDateTime类的对象,并显示年、月、日、时、分、秒
package java_study;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test_DateTineFormatter {
public static void main(String[] args) {
String time="2014-04-01:13:24:01";
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy-MM-dd:HH:mm:ss");
LocalDateTime date=LocalDateTime.parse(time, formatter);
System.out.println(date.toString());
}
}
14、ZoneDateTime类
课程概要:
概述
常用方法
一、概述
ZoneDateTime处理日期和时间与相应的时区
二、常用方法
1、ZoneDateTime.now()
获取系统当前日期和事件
2、String format(DateTimeFormatter formatter)
按指定模板将日期对象格式化为一个字符串
【案例】将当前日期格式化为字符串并显示年、月、日、时、分、秒
package java_study;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Test_ZonedDateTime {
public static void main(String[] args) {
ZonedDateTime date=ZonedDateTime.now();
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("MM/dd/yyyy:HH:mm:ss");
String strDate=date.format(formatter);
System.out.println(strDate);
}
}