含具体案例 Java8新特性之Stream流( 二 )

结果:

含具体案例 Java8新特性之Stream流

文章插图
4.映射(map/flatMap) 映射,可以将一个流的元素按照一定的映射规则映射到另一个流中 。分为mapflatMap
  • map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素 。
  • flatMap:接收一个函数作为参数 , 将流中的每个值都换成另一个流,然后把所有流连接成一个流 。
public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("张三", 1000, 20, "男", "北京"));personList.add(new Person("李四", 2000, 21, "男", "南京"));personList.add(new Person("王五", 3000, 20, "女", "合肥"));personList.add(new Person("赵六", 4000, 22, "男", "四川"));personList.add(new Person("孙七", 5000, 25, "女", "上海"));// 将员工工作全部增加10000元// 1、方式一:不改变原来员工集合List<Person> personListNew = personList.stream().map(person -> {Person personNew = new Person(person.getName(), 0, 0, null, null);personNew.setSalary(person.getSalary() + 10000);return personNew;}).collect(Collectors.toList());System.out.println("一次改动前:" + personList.get(0).getName() + ">>>" + personList.get(0).getSalary());System.out.println("一次改动后:" + personListNew.get(0).getName() + ">>>" + personListNew.get(0).getSalary());// 2、方式二:改变原来员工集合的方式List<Person> personListNew2 = personList.stream().map(person -> {person.setSalary(person.getSalary() + 10000);return person;}).collect(Collectors.toList());System.out.println("二次改动前:" + personList.get(0).getName() + ">>>" + personListNew.get(0).getSalary());System.out.println("二次改动后:" + personListNew2.get(0).getName() + ">>>" + personListNew.get(0).getSalary());// 将两个字符数组合并成一个新的字符数组List<String> list = Arrays.asList("Hello", "World");Stream<String> map = list.stream().map(s -> s.split("")).flatMap(Arrays::stream);map.forEach(System.out::print);System.out.println();// 给定两个数字列表 获取所有的数对List<Integer> numbers1 = Arrays.asList(1, 2, 3);List<Integer> numbers2 = Arrays.asList(3, 4);// flatMap升维度List<int[]> pairs = numbers1.stream().flatMap(x -> numbers2.stream().map(y -> new int[] { x, y })).collect(Collectors.toList());for (int[] pair : pairs) {System.out.print(Arrays.toString(pair));}}结果:
含具体案例 Java8新特性之Stream流

文章插图
5.归约(reduce)归约,也称缩减 , 顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作 。
public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("张三", 1000, 20, "男", "北京"));personList.add(new Person("李四", 2000, 21, "男", "南京"));personList.add(new Person("王五", 3000, 20, "女", "合肥"));personList.add(new Person("赵六", 4000, 22, "男", "四川"));personList.add(new Person("孙七", 5000, 25, "女", "上海"));// 求所有员工的工资之和、最高工资// 求工资之和方法1:Optional<Integer> sumSalary = personList.stream().map(Person::getSalary).reduce(Integer::sum);// 求工资之和方法2:Integer sumSalary2 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(), Integer::sum);// 求最高工资方法1:Integer maxSalary = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(), Integer::max);// 求最高工资方法2:Integer maxSalary2 = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(), (max1, max2) -> max1 > max2 ? max1 : max2);// 求最高工资方法3:Integer maxSalary3 = personList.stream().map(Person::getSalary).reduce(Integer::max).get();System.out.println("工资之和 , 方法1:" + sumSalary);System.out.println("工资之和,方法2:" + sumSalary2);System.out.println("最高工资,方法1:" + maxSalary);System.out.println("最高工资,方法2:" + maxSalary2);System.out.println("最高工资 , 方法3:" + maxSalary3);}结果:
含具体案例 Java8新特性之Stream流

文章插图
6.收集(collect) collect , 收集,可以说是内容最繁多、功能最丰富的部分了 。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合 。
collect主要依赖java.util.stream.Collectors类内置的静态方法 。
6.1归集(toList/toSet/toMap)因为流不存储数据,那么在流中的数据完成处理后,需要将流中的数据重新归集到新的集合里 。toList、toSet和toMap比较常用 , 另外还有toCollection、toConcurrentMap等复杂一些的用法 。

推荐阅读