Java8:2万字20个实例玩转集合—筛选、归约、分组、聚合( 二 )


// import已省略 , 请自行添加 , 后面代码亦是public class StreamTest { public static void main(String[] args) {List list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);// 遍历输出符合条件的元素list.stream().filter(x -> x > 6).forEach(System.out::println);// 匹配第一个Optional findFirst = list.stream().filter(x -> x > 6).findFirst();// 匹配任意(适用于并行流)Optional findAny = list.parallelStream().filter(x -> x > 6).findAny();// 是否包含符合特定条件的元素boolean anyMatch = list.stream().anyMatch(x -> x < 6);System.out.println("匹配第一个值:" + findFirst.get());System.out.println("匹配任意一个值:" + findAny.get());System.out.println("是否存在大于6的值:" + anyMatch);}}3.2 筛选(filter)筛选 , 是按照一定的规则校验流中的元素 , 将符合条件的元素提取到新的流中的操作 。
Java8:2万字20个实例玩转集合—筛选、归约、分组、聚合文章插图
案例一:筛选出Integer集合中大于7的元素 , 并打印出来
public class StreamTest { public static void main(String[] args) {List list = Arrays.asList(6, 7, 3, 8, 1, 2, 9);Stream stream = list.stream();stream.filter(x -> x > 7).forEach(System.out::println); }}预期结果:
8 9
案例二: 筛选员工中工资高于8000的人 , 并形成新的集合 。形成新集合依赖collect(收集) , 后文有详细介绍 。
public class StreamTest { public static void main(String[] args) {List personList = new ArrayList();personList.add(new Person("Tom", 8900, 23, "male", "New York"));personList.add(new Person("Jack", 7000, 25, "male", "Washington"));personList.add(new Person("Lily", 7800, 21, "female", "Washington"));personList.add(new Person("Anni", 8200, 24, "female", "New York"));personList.add(new Person("Owen", 9500, 25, "male", "New York"));personList.add(new Person("Alisa", 7900, 26, "female", "New York"));List fiterList = personList.stream().filter(x -> x.getSalary() > 8000).map(Person::getName).collect(Collectors.toList());System.out.print("高于8000的员工姓名:" + fiterList); }}运行结果:
高于8000的员工姓名:[Tom, Anni, Owen]
3.3 聚合(max/min/count)max、min、count这些字眼你一定不陌生 , 没错 , 在mysql中我们常用它们进行数据统计 。 Java stream中也引入了这些概念和用法 , 极大地方便了我们对集合、数组的数据统计工作 。
Java8:2万字20个实例玩转集合—筛选、归约、分组、聚合文章插图
案例一:获取String集合中最长的元素 。
public class StreamTest { public static void main(String[] args) {List list = Arrays.asList("adnm", "admmt", "pot", "xbangd", "weoujgsd");Optional max = list.stream().max(Comparator.comparing(String::length));System.out.println("最长的字符串:" + max.get()); }}输出结果:
最长的字符串:weoujgsd
案例二:获取Integer集合中的最大值 。
public class StreamTest { public static void main(String[] args) {List list = Arrays.asList(7, 6, 9, 4, 11, 6);// 自然排序Optional max = list.stream().max(Integer::compareTo);// 自定义排序Optional max2 = list.stream().max(new Comparator() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}});System.out.println("自然排序的最大值:" + max.get());System.out.println("自定义排序的最大值:" + max2.get()); }}输出结果:
自然排序的最大值:11自定义排序的最大值:11
案例三:获取员工工资最高的人 。
public class StreamTest { public static void main(String[] args) {List personList = new ArrayList();personList.add(new Person("Tom", 8900, 23, "male", "New York"));personList.add(new Person("Jack", 7000, 25, "male", "Washington"));personList.add(new Person("Lily", 7800, 21, "female", "Washington"));personList.add(new Person("Anni", 8200, 24, "female", "New York"));personList.add(new Person("Owen", 9500, 25, "male", "New York"));personList.add(new Person("Alisa", 7900, 26, "female", "New York"));Optional max = personList.stream().max(Comparator.comparingInt(Person::getSalary));System.out.println("员工工资最大值:" + max.get().getSalary()); }}输出结果:
员工工资最大值:9500
案例四:计算Integer集合中大于6的元素的个数 。
import java.util.Arrays;import java.util.List;public class StreamTest { public static void main(String[] args) {List list = Arrays.asList(7, 6, 4, 8, 2, 11, 9);long count = list.stream().filter(x -> x > 6).count();System.out.println("list中大于6的元素个数:" + count); }}输出结果:
list中大于6的元素个数:4
3.4 映射(map/flatMap)映射 , 可以将一个流的元素按照一定的映射规则映射到另一个流中 。 分为map和flatMap: