jdk1.8新特性

lambda表达式

lambda表达式可以称之为闭包.他是java8中的一个非常重要的特性,很多的用法都用到了此表达式,lambda表达式允许把函数作为一个方法的参数,函数作为参数进行传递到方法中,从而使得代码更加简洁

  • 语法
(parameters)->expression代码块
	参数			方法代码
或
(parameters)->{statement 代码块}

说明:
- 可选参数声明:不需要声明参数类型,编译器统一识别参数值
- 可选参数圆括号:一个参数无需定义圆括号,多个参数需要定义
- 可选大括号:如果主体包含了一个语句就不需要使用大括号
- 可选返回关键字:如果主体只有一个表达式返回值,则编译器会自动返回值,而大括号需要明确指定返回一个数据
比如:

//不需要参数,但返回值为5
()->5

//接受一个参数(推断出是数字类型),返回的是参数的二倍
x->2*x

//接受两个参数(推断是数字类型),返回参数的差值
(x,y)->x-y

//接受两个指定类型的参数,返回参数的差值
(int x,int y)->x-y

//接受一个String类型的参数,并输出这个参数的值
//推断出没有返回值,相当于方法的返回值为void
(String str)->System.out.println(str);

其实lambda表达式的本质就是接口的子实现
lambda表达式简化了匿名内部类的写法
lambda的另一个说法叫做函数式编程(因为在代码中看不到类,只看到了方法/函数)

使用lambda表达式需要注意变量的作用域

  • lambda表达式能引用外层成员变量,如果外层的成员变量标记了final,那么lambda内部不能改变外部成员变量的值
  • lambda表达式的局部变量.可以不用声明final,但是必须不可以被后面的代码修改(即隐式的final特性)
  • lambda表达式中不允许声明一个与局部变量同名的参数或局部变量

方法引用

**方法的引用方式: 类名::方法名 其本质还是lambda表达式
具体写法有如下四种:
**

1. 构造器的引用	语法:Class::new
2. 静态方法的引用	语法:Class::静态方法名称
3. 特定的类的任意的对象引用	语法:Class::非静态方法
4. 特定的对象的方法引用	语法:对象::非静态方法

函数式接口

函数式接口(functioninterface)就是一个有且只有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以用lambda表达式,也可以用方法的引用

在jdk1.8之前已经有部分函数式接口
比如:

java.lang.Runnable
java.util.Comparator
java.io.FileFilter

在jdk1.8之后新添加的函数式接口

java.util.Function	其中包含了很多类
比如:
	Consumer<T>
	Predicate<T>
	Supplier<T>
	等...

默认方法

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

java和javascript交互

stream api (管道理念)

在java8中添加了一个新的抽象称之为流Stream,可以让你以一种声明式的方式处理数据,Stream流处理方式可以把要处理的元素看成是一种流,流在管道中传输,并且可以用在管道的节点上进行处理
处理包含:筛选,排序,聚合等操作
元素流在管道中经过中间的操作的处理,最后由最终的操作得到前面的处理结果

Stream流管道中的几个名词解释:

  • 数据源:说明是流的源头,可以是集合,数组,IO,其他的数据源
  • 聚合操作:就是一些在流中筛选数据的操作.比如(filter,map,reduce,find,match,sorted等…)

如何生成一个Stream流的源头

  • stream() 生成一个串行流
  • parallelStream() 生成一个并行流
  • 比如:
List<String> strings=Arrays.asList("asd","qwe","ert","");
List<String> filtered=strings.stream().filter(str->!str.isEmpty()).Collection.toList();
  • 用Stream流的forEach
forEach方式用来迭代流中的每一个数据
Random random=new Random();
random.ints().limit(10).forEach(System.out::println);
  • map方法用于映射每个元素对应的结果
List<Integer> numbers=Arrays.asList(3,5,7,25,4);
List<Integer> aquare8_5=numbers.stream().map(i->i*i).distinct.collect(collection,toList());
  • filter用于通过设置条件滤除元素
long count8_2=strings.stream().filter((str)->str.length()==3).count();
System.out.println(count8_2);
  • limit用于获取指定数量的流
Random random=new Random();
random.ints(0,100).limit(10).sorted().forEach(System.out::print);
  • socket用于对指定的流进行排序
Random random=new Random();
random.ints(0,100).limit(10).sorted().forEach(System.out::print);
  • Collection 类实现了很多的规约操作
List<String> strings=Arrays.asList("aasd","asda","dasd"," ");
List<Integer> aquare8_5=numbers.stream().map(i->i*i).distinct().collect(Collection,toList());

DateTime api(对java7及以前的日期的加强)

java8通过发布新的Date-Time api(JSR310)来进一步加强对日期与实践的处理,在旧版中的日期和时间的api存在有很多的问题

  • 非线程安全,java.util.Date是非线程安全的,所有的日期类都是可变的
  • 设计很差,java.util.Date跟java.sql.Date类都是日期类,重复的定义很多,所以java用Calendar类来替代java.util.Date
  • 时区处理很麻烦,在java.util.Date中并没有提供对时区处理的api
java.util.Calendar能控制时区
java.util.TimeZone能够控制时区

在java8中有一个包叫java.time包提供了很多的新的api

  • Local(本地):简化了日期和时间的处理,没有时区的问题
  • Zoned(时区):通过制定的时区处理日期和时间

Option类 专门用来解决空指针异常问题

Base64类 专门用来对数据做编码和解码(加密和解密)

等等…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值