JAVA8新特性:Stream
2019-06-27 本文已影响0人
白桦树97
1.筛选与切片:
List<Device> list = new ArrayList<>();
list.add(new Device(1,"yueliang"));
list.add(new Device(1,"yueliang"));
list.add(new Device(2,"xiannv"));
list.add(new Device(3,"xiaohong"));
list.add(new Device(5,"xiaolv"));
list.add(new Device(7,"hah"));
list.add(new Device(9,"xixi"));
list.stream()
.filter(e->e.getId()<7) //取id小于7的对象
.distinct() //去重,必须重写对象的equals和hashcode方法
.limit(3) //取前三个
.skip(1) //跳过第一个
.forEach(System.out::println);
测试结果
image.png2.映射:
接受lambda,作用到每一个元素,并得到新值
1.大小写转换
List<String> list = Arrays.asList("xixi","hah","ddidi");
list.stream()
.map(str->str.toUpperCase())
.forEach(System.out::println); //输出结果转换为大写
2.提取每个对象的名称
List<Device> list = new ArrayList<>();
list.add(new Device(1, "name1"));
list.add(new Device(4, "hah"));
list.add(new Device(3, "xixi"));
list.stream()
.map(Device::getName)
.forEach(System.out::println);
3.排序(自定义排序):
按照id排序,如果id相同则按照姓名排序
List<Device> list = new ArrayList<>();
list.add(new Device(4, "hah"));
list.add(new Device(1, "a"));
list.add(new Device(1, "c"));
list.add(new Device(1, "b"));
list.add(new Device(3, "xixi"));
list.stream()
.sorted((e1,e2)->{
if(e1.getId().equals(e2.getId())){
return e1.getName().compareTo(e2.getName());
}else return e1.getId().compareTo(e2.getId());
})
.forEach(System.out::println);
4.查找和匹配(以下均为终止操作):
image.png例如:
long count = list.stream().count();
System.out.println(count);
5.规约(将流中元素反复结合,形成一个新的值):
下面即著名的goole框架模式 map-reduce
Optional<Integer> sum = list.stream()
.map(e -> e.getId())
.reduce(Integer::sum); //相当于.reduce((e1,e2)->e1+e2);
System.out.println(sum);
6.⭐️收集:(将流转换成其他集合形式)
List<Device> collect = list.stream()
.filter(e->e.getId()<2)
.collect(Collectors.toList());
collect.forEach(System.out::println);
还有个小特性:惰性求值
//中间操作,不执行任何操作
Stream<Device> stream = list.stream()
.filter((e)->{
System.out.println("执行中间操作");
return e.getId()>2;
});
//最终操作:一次执行全部内容,即:惰性求值
stream.forEach(System.out::println);