JDK 1.8遍历和Stream
不一样的遍历
摒弃掉传统的for循环的写法,让你体验到遍历的快感
for (int index = 0; index < list.size(); index++) {
User user = list.get(index);
System.out.println(user.getName());
System.out.println(user.getId());
}
for (User user : list) {
System.out.println(user.getName());
System.out.println(user.getId());
}
//执行多行业务代码,需要用大括号包起来
list.forEach(user -> {
System.out.println(user.getName());
System.out.println(user.getId());
}
);
//只执行一行业务代码
list.forEach(user -> System.out.println(user.getName()));
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//如果list中的对象是基本类型的对象,则可以直接通过 :: 获取打印
strings.forEach(System.out::println);
实战
获取一个list当中实体类类的idList
List<String> oppIds = list.stream().map(OpportunityVO::getOppId).collect(Collectors.toList());
过滤一个list,获取到所有的activityId不为空的去重Set
Set<String> activityIds = list.stream().filter(opp -> StringUtils.isNotEmpty(opp.getActivityId()))
.map(OpportunityVO::getActivityId).collect(Collectors.toSet());
Stream API
- 转换:stream() 把一个list转换成流
- 转换:collect(Collectors.toList()); 把一个流转换为一个list
- 过滤:filter(string -> !string.isEmpty()) 过滤
- 限流:limit(),比如取集合中 age>30的前2个员工信息
- 加工:map() 作用是修改迭代中的每个元素,功能有点像foreach,只是侧重点不同,map()侧重修改,foreach侧重遍历
- 遍历:foreach() 这个和list的用起来一样
- 去重:distinct() 去重(基本类型数据的去重)
- 求和:count() 直接返回流的结果值
- 排序:sorted()(支持正序、逆序、Compare字段比较和自定义字段比较
// 获取所有用户名卫hanmeimei的用户数据
List<A> firstA= AList.stream() .filter(a -> "hanmeimei".equals(a.getUserName())) .collect(Collectors.toList());
// 获取用户年龄在 30 <age <60 之间的用户
List<User> midAgeUserList = list.stream().filter(user -> 30 < user.getAge())
.filter(user -> 60 > user.getAge())
.collect(Collectors.toList());
int count = strings.stream().filter(string -> string.isEmpty()).count();
// forEach这两个类都支持这个方法
list.stream().forEach(user -> System.out.println(user.getName()));
list.forEach(user -> System.out.println(user.getName()));
list.stream().sorted().collect(Collectors.toList());
list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
创建线程
可以简化匿名内部类的编写
new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("hello kitty" + i);
}
}).start();
网友评论