您的位置:首页 > 其它

Stream API---2.中间操作

2017-04-06 14:27 369 查看
1.过滤 filter :惰性求值

接收一个lambda表达式,过滤掉某些元素,留下复合要求的

(1)对于任何流的操作,首先都要先创建流,这里通过List的stream方法创建流。

(2)任何中间操作都是惰性求值:都只是刻画出了Stream,没有产生新的集合,也就是说,,多个中间操作构成的流水线只有在触发终止操作时会一次性全部处理,否则中间操作执行任何处理。

(3)在Stream中多次转换并不意味着要进行多次for循环,因为转换是惰性求值,所有转换都在及早求值(终止操作)时一次执行完。

如:例子中第二部分 并没有输出“中间操作”,而是在调用forEach时才执行System.out.println(中间操作)

List<Employee> employees = Arrays.asList(
new Employee( "李四", 59, 6666.66),
new Employee("张三", 18, 9999.99),
new Employee( "王五", 28, 3333.33),
new Employee("赵六", 8, 7777.77),
new Employee("赵六", 8, 7777.77),
new Employee("赵六", 8, 7777.77),
new Employee( "田七", 38, 5555.55)
);

employees.stream()//创建
.filter((e)->e.getAge()>10)//过滤
.forEach(System.out::println);//终止
System.out.println("--------------------------");
Stream<Employee> s=employees.stream()
.filter((e)->{
System.out.println("中间操作");
return e.getAge()>10;
});
System.out.println("--------------------------");
s.forEach(System.out::println);
System.out.println("--------------------------");
employee.Employee@873330
employee.Employee@19d7047
employee.Employee@16ec8df
employee.Employee@ec7777
--------------------------
--------------------------
中间操作
employee.Employee@873330
中间操作
employee.Employee@19d7047
中间操作
employee.Employee@16ec8df
中间操作
中间操作
中间操作
中间操作
employee.Employee@ec7777
--------------------------

2.内部迭代和外部迭代
(1)内部迭代:迭代工作由Stream API完成

employees.stream()//创建
.filter((e)->e.getAge()>10)//过滤
.forEach(System.out::println);//终止



(2)外部迭代:我们显示调用for循环或者iterater

for循环其实是封装了iterator的语法糖,本质上也是调用了Iterator对象,而这两种外部迭代都是一种串行操作,必须按照集合元素的顺序进行遍历

Iterator<Employee> it=employees.iterator();
while(it.hasNext()){
System.out.println(it.next());
}

for(Employee emp1:employees){
System.out.println(emp1);
}



3.截断流 l
c98c
imit  

limit(num)使元素数量不超过num个,一般情况下是先过滤在截断。由输出结果可以看到只要找到满足条件的2个员工,就不在执行filter了,这在某种程度上也是对系统速度的提升。就相当于&&   一样,只要左边是FALSE,那么不用判断右边就直接可以输出结果为FALSE了。这里也是,找到满足个数的元素个数,后边的就不用在看了。如果没有达到指定书目的员工,
 返回满足元素的流

employees.stream()
.filter((e)->{
System.out.println("截断前 过滤");
return e.getAge()>25;
})
.limit(2)
.forEach(System.out::println);

System.out.println("--------------------------");
截断前   过滤
employee.Employee@873330
截断前   过滤
截断前   过滤
employee.Employee@19d7047
--------------------------


eg:limit(5)只有3个元素满足,那么流中就保留3个元素
截断前 过滤
employee.Employee@873330
截断前 过滤
截断前 过滤
employee.Employee@19d7047
截断前 过滤
截断前 过滤
截断前 过滤
截断前 过滤
employee.Employee@16ec8df
--------------------------

4、skip(n)
扔掉前n个元素,从第n+1个开始,该方法和limit互补。由结果可以看出,与limit不同的是,此处的filter会每次都执行。

employees.stream()
.filter((e)->{
System.out.println("截断前 过滤");
return e.getAge()>15;
})
.skip(2)
.forEach(System.out::println);

System.out.println("--------------------------");
截断前   过滤
截断前   过滤
截断前   过滤
employee.Employee@873330
截断前   过滤
截断前   过滤
截断前   过滤
截断前   过滤
employee.Employee@19d7047
--------------------------


5、distinct 去重复
重复的判定是依照:hashCode和equeals的,所以在去重时,要重写该类的hashCode和equals,否则无效
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: