Java8 Lambda表达式和Stream学习

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

这是这次测试用的Entity:

public class people {

    private String name;
    private String sex;
    private Integer age;
}

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

ArrayList<people> list = new ArrayList<>();
        for(int i = 0;i < 10 ;i++){
            people people2 = new people();
            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<people> 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<people> max = peopleStream.max((p1, p2) -> p1.getAge().compareTo(p2.getAge()));
min:则是将max换成min。

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

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

 

 Terminal:

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

版权声明:本文为Yye0118原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Yye0118/p/9577395.html