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类,专门用来对数据做编码和解码的
等等.............
上一篇: Demo登录框的可拖拽 原生与jQuery两种办法实现教程
下一篇: 蒸饺的皮硬是怎么回事?