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("--------------------------");
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("--------------------------");
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("--------------------------");
5、distinct 去重复
重复的判定是依照:hashCode和equeals的,所以在去重时,要重写该类的hashCode和equals,否则无效
接收一个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,否则无效
相关文章推荐
- java8 Stream API 的操作2 中间操作
- Stream API---终止操作
- Java8新特性-006-Stream筛选与切片-中间操作
- JAVA 8 StreamAPI 和 lambda表达式 总结(二)--Stream基本操作
- Java8新特性-008-Stream排序-中间操作
- JAVA 8 的Stream API操作,别再使用if-else循环了,
- java8 Stream API 的操作步骤
- java8_02_stream(一)创建流和中间操作
- Java8-Stream-中间操作
- JAVA 8 StreamAPI 和 lambda表达式 总结(四)--stream的一些聚合操作
- Stream之第二步中间操作
- 项目记事【StreamAPI】:使用 StreamAPI 简化对 Collection 的操作
- Adodb.Stream是ADO的Stream对象,提供存取二进制数据或者文本流,从而实现对流的读、写和管理等操作.
- 在C#中如何调用windows的API进行关机操作!!! [转]
- 使用EJB3 Java 持久化API来标准化Java的持久化操作
- java中String的操作api
- 解读VC++程序开发中的文件操作API和CFile类
- c#中调用操作INI文件的API
- Adodb.Stream是ADO的Stream对象,提供存取二进制数据或者文本流,从而实现对流的读、写和管理等操作.
- Google Maps API 2.0解析(11-GKeyboardHandler支持键盘操作的类)