java8学习_java8学习

Java8 Lambda表达式和Stream学习

lambda表达式和Stream是Java8的新特性,这次分享一下我在学习lambda表达式和Stream的收获。

这是这次测试用的Entity:

public classpeople {privateString name;privateString sex;privateInteger age;

}

这是测试实体类使用的数据:

ArrayList list = new ArrayList<>();for(int i = 0;i < 10 ;i++){

people people2= newpeople();

people2.setName("-----楼下小黑");

people2.setSex("男");

people2.setAge(30-i);

list.add(people2);

}

下面是简单的使用lambda表达式对集合进行的一个简单的排序。

p1和p2是对比的两个people对象,使用对象的年龄字段来进行排序,正序排列,年龄最小的排在集合的第一位。

list.sort((p1,p2) -> p1.getAge().compareTo(p2.getAge()));

还可以和java8中的stream配合使用来对集合进行过滤操作,parallelStream也是流中的一个方法,并行流,将集合转换成流之后,多线程来操作集合,代码中还对集合进行了过滤,年龄大于25岁people对象,并通过foreach输出,labdam表达式foreach结构跟普通的foreach循环结构类似,(parameters) -> expression 或者 (parameters) ->{ statements; } ,

操作时,他会自动判断(parameters)的类型,然后在 -> 来对当前的people对象进行操作,如果集合对象数据量大的话,理论上可以提升效率,但是实际上如果数据量不大,还是循环迭代的效率更快,因为多线程的任务切换占用执行的大部分时间,代码如下:

list.parallelStream().filter(people -> people.getAge()>25).forEach(people -> System.out.println(people));

这段代码输出的对象是年龄大于25岁的 而如果不使用lambda表达式和Stream,我们肯定直接想到的就是For循环来完成这个判断,但是Foreach循环是循环每一个对象然后取年龄来进行判断。而且For循环是封装了迭代的语句块,下面是使用iterator进行迭代的循环。

Iterator iterator =list.iterator();

while(iterator.hasNext()){

people p2 =iterator.next();

if(p2.getAge()>25){

System.out.println(p2);

}

}

整个迭代过程是调用iterator返回一个泛型为people的迭代对象,来控制整个循环的流程,使用hasNext和next来完成迭代;

而java8的Stream是则是通过Stream方法来创建一个Stream对象,然后之后所有的操作都是针对于这个Stream对象,Stream操作的是无序的对象,其中还有parallelStream并行流,可以多线程来操作集合对象在一些集合数据多的情况下来提升效率,而针对Stream的所有操作都是在操作Stream,只有foreach获取结果时才能操作结果,所以这种迭代方式称为内部迭代。

lambda表达和Stream搭配使用,在某些情况下,可以使代码变得更效率,更简洁。

Stream的学习

在前面的例子中,我们对通过Stream集合的操作可以分为三个步骤

获得Stream对象,

Intermediate:通过一系列中间方法,对数据集进行过滤,检索等操作.可能有多次Intermediate操作,

Terminal:最终步骤,完成对结果的操作,如上面例子中的foreach操作中的打印。

Intermediate:

concat:

可以将两个Stream连接在一起,如果是两个泛型不同的Stream也可以合并,但是会返回一个Object的Stream对象:

Stream.concat(Stream.of("1","2"), list.parallelStream()).forEach((obj) -> System.out.println(obj));

控制台输出的是people对象的toString()方法和1,2。

map:

遍历Stream,相当于循环了,可以在遍历每一个元素并且可以进行操作,下面是将每一个peopel对象的年龄乘以2,并输出:

list.stream().map(people -> {people.setAge(people.getAge()*2);return people;}).forEach(people -> System.out.println(people));

distinct:

去掉重复的元素,注意,这里去掉重复不是对象,而是根据内存地址来判断,如果你对象指向的栈或者堆中的地址是相同的,就会去掉重复的对象。

people people1 = new people("楼下小白", "女", 255);

list.add(people1);

list.add(people1);

list.stream().distinct().forEach(people-> System.out.println(people));

max:

可以找出Stream中某个可比值中最大的值。

Optional max = peopleStream.max((p1, p2) -> p1.getAge().compareTo(p2.getAge()));

min:则是将max换成min。

比较常用的就是这几个方法了,其他还有一部分方法就不在这里一一写出了。

还有的是,因为lambda表达式的方法语句看起来很简单,所以变量名字如果可以尽写的剪短一点,列入p1,p2这种,可以让表达式变得更为简洁。

Terminal:

结束操作,将经过中间操作的流结束,获得经过中间操作的结果,最常见的是跟随本次java8一起的更新在集合接口的内部迭代方法foreach方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值