(初学)JDK1.8新特性

一、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);


	}

}

测试:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值