java8新特性

目录



一,lambda表达式语法

1,lambda初体验

维基百科上对于”Lambda expression”的解释:
在这里插入图片描述
来个例子,对一个list进行排序,可以看到现在变的非常简单

List<String> lists = new ArrayList();
lists.add("a");
lists.add("b");
lists.add("c");
lists.add("d");
Collections.sort(lists,(o1,o2) -> o1.compareTo(o2));

再来个例子,实现效果就是大写字符变小写

List<String> lists = new ArrayList();
lists.add("ZhangSan");
lists.add("LiSi");
List<String> lowercaseLists = lists.stream().map((String name) -> {return name.toLowerCase();}).collect(collectors.toList());

在java8之前,同样的效果需要这样操作,明显步骤繁琐。

List<String> lists = new ArrayList();
lists.add("ZhangSan");
lists.add("LiSi");
List<String> lowercaseLists =new ArrayList();
for(String name :lists){
	lowercaseLists.add(name.toLowerCase());
}

2,lambda语法

lambda的一般语法

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
	statment1;
	statment2;
	//.............
	return statmentM;
}

其实,参数类型,编译器可以推断出来,所以可以如下:

(param1, param2, ..., paramN) -> {
	statment1;
	statment2;
	//.............
	return statmentM;
}

这样那个字符转小写的就可以变成下面这样。只有一个参数的时候,小括号也可以去掉

List<String> lowercaseLists = lists.stream().map(name -> {return name.toLowerCase();}).collect(collectors.toList());

同样的也可以使用Method Reference,更简洁了

List<String> lowercaseLists = lists.stream().map(String::toLowerCase).collect(collectors.toList());

3,lambda访问外部数据

lambda也可以访问外部数据,可以看到,它访问到了i这个变量

//Lists,Strings是Guava中的一个工具类

String[] array = {"a", "b", "c"};
for(Integer i : Lists.newArrayList(1,2,3)){
  Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}

而且这个i是不可变的。比如下面,这个就报错了。因为i变了,引用变了。

//Lists,Strings是Guava中的一个工具类
String[] array = {"a", "b", "c"};
for(int i = 1; i<4; i++){
  Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}

4,Method reference和construct reference

方法引用

方法引用语法格式有以下三种:

objectName::instanceMethod
ClassName::staticMethod
ClassName::instanceMethod

前两种方式类似,比如System.out::println等同于x->System.out.println(x);Math::max等同于(x, y)->Math.max(x,y)。
最后一种方式,比如String::toLowerCase等同于x->x.toLowerCase()。

构造器引用

构造器引用语法如下:ClassName::new,把lambda表达式的参数当成ClassName构造器的参数 。例如BigDecimal::new等同于x->new BigDecimal(x)。

二,Stream语法

1. Stream初体验

定义:A sequence of elements supporting sequential and parallel aggregate operations.

解释:
Stream是元素的集合,这点让Stream看起来用些类似Iterator;
可以支持顺序和并行的对原Stream进行汇聚的操作;

来个例子,求list中不为null的个数

//Lists是Guava中的一个工具类
List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6);
nums.stream().filter(num -> num != null).count();

stream通用语法
在这里插入图片描述

2. 转换stream

1,distinct: 对于Stream中包含的元素进行去重操作
在这里插入图片描述
2, filter: 对于Stream中包含的元素使用给定的过滤函数进行过滤操作,新生成的Stream只包含符合条件的元素;
在这里插入图片描述
3,map: 对于Stream中包含的元素使用给定的转换函数进行转换操作
在这里插入图片描述
4,flatMap:和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中;
在这里插入图片描述
5,生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;
在这里插入图片描述
6, limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
在这里插入图片描述
7,skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值