Stream接口简单使用
什么是stream?
Stream是元素得集合,这点让Stream看起来类似Iterator;可以支持顺序和并行的对原Stream进行汇聚的操作
我们可以把Stream当成一个高级版本的Iterator,原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤大于10的数字”,“获取所有数字的和”等,具体这些操作如何应用到每个元素上,就给Stream就好了!
代码演示:
定义一个实体类:
class Cat { private String name; private int age; public Cat() { } public Cat(String name, int age) { this.name = name; this.age = age; } // get,set,toString @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Cat cat = (Cat) o; return age == cat.age && Objects.equals(name, cat.name); } @Override public int hashCode() { return Objects.hash(name, age); } }
添加对象到集合中:
List<Cat> catsList = new ArrayList<>(); catsList.add(new Cat("tom", 3)); catsList.add(new Cat("tom", 3)); catsList.add(new Cat("uom", 3)); catsList.add(new Cat("tom", 1)); catsList.add(new Cat("jek", 2)); catsList.add(new Cat("join", 3));
案列1:遍历集合
private static void test1(List<Cat> catsList) { catsList.forEach(System.out::println); }
案列2:筛选集合中年龄大于2的并把它们的名字组成一个新的集合
private static void test1(List<Cat> catsList) { List<String> collect = catList.stream().filter(a -> a.getAge() > 2).map(Cat::getName).collect(Collectors.toList()); }
案列3:转换为set集合
private static void test1(List<Cat> catsList) { //Set<Cat> collect = new HashSet<>(catsList);建议 Set<Cat> collect = catsList.stream().collect(Collectors.toSet()); }
案列4:按照年龄排序后转换成linkedHashSet集合
private static void test1(List<Cat> catsList) { LinkedHashSet lhs = catsList.stream().sorted(Comparator.comparing(Cat::getAge)).collect(Collectors.toCollection(LinkedHashSet::new)) }
案列5:找出年龄最大的,如果年龄一样找出名字比较大的
private static void test1(List<Cat> catsList) { Optional<Cat> max = catsList.stream().max((o1, o2) -> { if (o1.getAge() != o2.getAge()) { return o1.getAge() - o2.getAge(); } return o1.getName().compareTo(o2.getName()); }); System.out.println(max.orElse(null)); }
案例6:去重后计算年龄和
private static void test1(List<Cat> catsList) { Optional<Integer> reduce = catsList.stream().distinct().map(Cat::getAge).reduce(Integer::sum); System.out.println(reduce.orElse(-1)); }
案例7:判断是否所有的年龄都大于2岁
private static void test1(List<Cat> catsList) { boolean b = catsList.stream().allMatch(a -> a.getAge() > 2); }
案例8:判断是否至少有一个大于2岁的
private static void test1(List<Cat> catsList) { boolean b = catsList.stream().anyMatch(a -> a.getAge() > 2); }
案例9:按照年龄分组:
private static void test1(List<Cat> catsList) { Map<Integer, List<Cat>> collect = catsList.stream().collect(Collectors.groupingBy(Cat::getAge)); }