前言
jdk1.8给广大程序员们带来了非常大的编程便利,不仅大大简化了代码,自带的一些语法更是让人眼花缭乱,提升程序性能。其中最常见有如下几种:lambda表达式、方法引用和构造器引用、Stream语法。下面一一简单讲解:
1.lambda表达式
1.1排序:
给itemList中merchantBatchSerialNo按照升序排序,其中字段类型属性为int、Integer、long等有大小比较的基本元素才可排序。
匿名类写法:
List<ArHTItemObj> itemList = settleVmsMessage.getData().getItems();Collection.sort(itemList,new Comparator(itemList.getMerchantBatchSerialNo())){ @Override public int compare(Integer merchantS1,Intrger merchantS2){ return merchantS1.CompareTo(merchantS2); }}
lambda写法
List<ArHTItemObj> itemList = settleVmsMessage.getData().getItems();itemList.sort((s2,s1)——>Integer.valueOf(s2.getMerchantBatchSerialNo()).compareTo(Integer.valueOf(s1.getMerchantBatchSerialNo())));
还有按照排序算法(冒泡、快速、归并....)
2.方法引用和构造器引用
2.1 方法引用:
- objectName::instanceMethod
- ClassName::staticMethod
- ClassName::instanceMethod
前两种方式类似,等同于把lambda表达式的参数直接当成instanceMethod|staticMethod的参数来调用。比如System.out::println等同于x->System.out.println(x);Math::max等同于(x, y)->Math.max(x,y)。
最后一种方式,等同于把lambda表达式的第一个参数当成instanceMethod的目标对象,其他剩余参数当成该方法的参数。比如String::toLowerCase等同于x->x.toLowerCase()。
可以这么理解,前两种是将传入对象当参数执行方法,后一种是调用传入对象的方法。
2.2 构造器引用:
构造器引用语法如下:ClassName::new,把lambda表达式的参数当成ClassName构造器的参数 。例如BigDecimal::new等同于x->new BigDecimal(x)。
3.Stream语法
两句话理解Stream:
1.Stream是元素的集合,这点让Stream看起来用些类似Iterator;
2.可以支持顺序和并行的对原Stream进行汇聚的操作;
大家可以把Stream当成一个装饰后的Iterator。原始版本的Iterator,用户只能逐个遍历元素并对其执行某些操作;包装后的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉
长度大于10的字符串”、“获取每个字符串的首字母”等,具体这些操作如何应用到每个元素上,就给Stream就好了!原先是人告诉计算机一步一步怎么做,现在是告诉计算机做什么,计算机自己决定怎么做。当然这个“怎么做”还是比较弱的。
例子:
//Lists是Guava中的一个工具类
List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6);nums.stream().filter(num -> num != null).count();
上面这段代码是获取一个List中,元素不为null的个数。这段代码虽然很简短,但是却是一个很好的入门级别的例子来体现如何使用Stream,正所谓“麻雀虽小五脏俱全”。我们现在开始深入解
刨这个例子,完成以后你可能可以基本掌握Stream的用法!
图片就是对于Stream例子的一个解析,可以很清楚的看见:原本一条语句被三种颜色的框分割成了三个部分。红色框中的语句是一个Stream的生命开始的地方,负责创建一个Stream实例;绿色框
中的语句是赋予Stream灵魂的地方,把一个Stream转换成另外一个Stream,红框的语句生成的是一个包含所有nums变量的Stream,进过绿框的filter方法以后,重新生成了一个过滤掉原nums列表
所有null以后的Stream;蓝色框中的语句是丰收的地方,把Stream的里面包含的内容按照某种算法来汇聚成一个值,例子中是获取Stream中包含的元素个数。如果这样解析以后,还不理解,那就只
能动用“核武器”–图形化,一图抵千言!
使用Stream的基本步骤:
1.创建Stream;
2.转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象(**可以有多次转换**);
3.对Stream进行聚合(Reduce)操作,获取想要的结果;