欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jdk1.8新特性

程序员文章站 2022-06-04 23:00:22
...

jdk1.8的新特性:

1.lambda表达式
		
		l 变得简洁
		
		语法:
				(parameters)->expression表达式
				或
				(parameters)->{statement代码块;}
		说明:
				1.可选参数声明:不需要声明参数类型,编译器统一识别参数值
				2.可选参数圆括号:一个参数无需定义圆括号,多个参数需要定义圆括号
				3.可选大括号:如果主体包含了一个语句,就不需要使用大括号
				4.可选返回关键字:如果主体只有一个表达式返回值,则编译器会自动返回值
				大括号需要指定返回了一个数据值
				
		比如:
				//不要参数,返回值为5
				()->5
				//接收一个参数(推断出数字类型),返回参数的2倍
				x->2*x
				//接收两个参数(推断出数字类型),返回值为参数差值
				(x,y)->x-y
				//接收两个参数,返回值为x-y
				(int x,int y)->x-y
				//接收一个参数,类型为String的参数,并输出参数的值
				//推断出没有返回值,相当于方法的返回值为void
				(String str)->System.out.println(str)
				//接收两个参数(推断出数字类型)但是返回值为参数的差值
				(x,y)->{return (x-y);}
				
				其实lamdba表达式的本质就是接口的子实现
				lambda表达式简化了匿名内部类的写法
				lambda表达式另一个写法叫做函数式编程
				注意:
					就是把接口的实现是内部类,转换成函数式写法
					
				使用lambda表达式需要注意变量的作用域问题:
				1.lambda表达式引用外层成员变量
				如果外层成员变量为final,则在lambda内部不能修改成员变量的值
				如果外层成员变量不为final,则在lambda内部能修改成员变量的值
				
				2.lambda表达式的局部变量可以声明为final.但必须不可以被后面的代码修改(即隐式的final特性)
				
				3.lambda表达式不允许声明一个与局部变量同名的参数或局部变量
				
2.方法的引用

		方法的引用方式用类名::方法名,其本质还是lambda表达式
		具体的写法有四种
			-构造器的引用       语法Class::new
			-静态方法的引用     语法Class::静态方法的名称
			-特定任意的对象引用 语法Class::非静态方法名称
			-特定对象的方法引用 语法instance::非静态的方法的名称
			
3.函数式接口(FunctionalInterface)
		函数式接口就是一个有且只有一个抽象方法,但是可以有非抽象方法的接口
		
		函数式接口可以用lambda表达式,也可以用方法的引用
		
		java8之前已经有部分函数式接口
			比如:java.lang.Runnable
				 java.util.Comparator
				 java.io.FileFilter
				 等....
		java8之后添加的函数式接口
		java.util.Function其中包含了很对类
		比如:
			Comsumer<T>
			Predicate<T>
			Supplier<T>
			等....
			
	总结:
		使用函数式接口,可以用如下方式实现
		1.java7的匿名内部类		
		2.lambda表达式       提高开发效率
		3.方法的引用
		4.lambda和方法的引用都是为了提高开发的效率			
		
4.默认方法

	在接口中可以放置有方法体的方法,但方法必须用default来修饰
	在接口添加默认方法,是用来给所有的子类提供一个功能
	在接口中还可以放置静态方法,静态方法需要有方法体
	
5.stream api 管道流

	在java8中添加了一个新的抽象,称之为Stream,可以让程序员以一种声明式的方式处理数据
	
	Stream流的处理方式,可以把要处理的元素看成一种流,流在管道中传输,并且在管道的节点上进行处理
	
	处理包括:
		筛选
		排序
		聚合
		等等....
	
	元素流在管道中经过操作处理,最后由最终的操作得到前面的处理结果
	
	Stream流管道的几个名词的解释
	 1.数据源:流的源头,可以是集合,数组,IO,其他的数据源
	 2.聚合操作:流中筛选数据的操作
		比如:filter,map,reduce,find,match,sotted等...
		
	如何生成一个Stream流的源头
	 -Stream() 生成一个串行流
	 -paralleStream() 生成一个并行流
	 比如:
		List<String> strings=Arrays.asList("abc","bc","cba","qaz","qwe","");
		List<String> filtered=
		strings.stream().filter(str->!str.isEmpty()).collect(Collections.toList());
		
	-用Stream的forEach
	forEach方法来迭代流中的每一个数据
	Random random=new Random();
	random.ints().limit(10).forEach(System.out::println);
	
	-map方法用于映射每个元素对应的结果
	List<Integer> numbers=Arrays.asList(3,2,3,3,7,3,5);
	List<Integer>
		lists=numbers.stream().map((i)->i*i).distinct.collect(Collectors.toList);
		
	-filter方法用于设置条件过滤元素
	List<String> strings=Arrays.asList("abc","bc","cba","qaz","qwe","");
		List<String> filtered=
		strings.stream().filter(str->!str.isEmpty()).collect(Collectors.toList());
		
	long count=strings.stream().filter((str)->str.isEmpty)).count
	
	-limit方法,用户获取指定数量的流
	Random random=new random();
	random.ints(0,100).limit(10).sorted.forEach(System.out::println);
	
	-sorted方法用于对流进行排序
	Random random=new random();
	random.ints(0,100).limit(10).sorted.forEach(System.out::println);
	
	-Collectors 类实现了很多规约操作
	List<Integer> numbers=Arrays.asList(3,2,3,3,7,3,5);
	List<Integer>
		lists=numbers.stream().map((i)->i*i).distinct.collect(Collectors.toList);
		
	List<String> strings=Arrays.asList("abc","bc","cba","qaz","qwe","");
	List<String> 
	filtered=strings.stream().filter(str->!str.isEmpty()).collect(Collectors.joining(","));
	
6.java8的日期操作
	
	java8通过发布新的Date-Time api(规范JSR310)
	时间处理
	在旧版的日期和时间api存在很多问题
	-非线程安全.java.util.Date是非线程安全的,所有日期类都是可变的
	-设计很差,java.util.Date和java.sql.Date类都是日期类,重复定义
	时区处理很麻烦,java.util.Date并没有提供处理时区的api
		用java.util.Calendar能控制时区
		Calendar c=Calendar.getIntance(java.util.Date);
	java.util.TimeZone能控制时区(java8)
	在java8中有一个包java.time包提供了很多新的api
	-local(本地) 简化了日期和时间的处理
	-zone(时区)  通过制定的时区处理日期和时间
	
	
	
7.Option类,专门用来解决空指针
8.Base64类,专门用来对数据做编码和解码的
等等.............
相关标签: jdk1.8新特性