Stream流常用方法大全

发布于:2025-06-12 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、遍历(forEach)和筛选(Filter)

// 遍历输出符合条件的值
list.stream().filter(l -> l > 5).forEach(System.out::println);

二、匹配(find/match)

// 匹配第一个
Optional<Integer> findFirst = list.stream().filter(l -> l > 5).findFirst();
// 匹配任意(适用于并行流)
Optional<Integer> findAny = list.parallelStream().filter(l -> l > 6).findAny();
// 是否包含符合特定条件的元素
boolean anyMatch = list.stream().anyMatch(l -> l > 6);

三、聚合(max/min/count)

List<String> list = Arrays.asList("adnm", "admmt", "pot", "xbangd", "weoujgsd");
Optional<String> max = list.stream().max(Comparator.comparing(String::length));
Optional<String> min = list.stream().min(Comparator.comparing(String::length));
System.out.println("最长的字符串:" + max.get());
System.out.println("最短的字符串:" + min.get());
List<Integer> list = Arrays.asList(7, 6, 9, 4, 11, 5);
long count = list.stream().filter(x -> x > 5).count();
System.out.println("list中大于5的元素个数:" + count);

四、映射(map、flatMap)

一对一的转化用map
String[] strArr = { "abcd", "bcdd", "defde", "fTr" };
List<String> strList = Arrays.stream(strArr).map(String::toUpperCase).collect(Collectors.toList());
一对多的转化用flatMap
List<String> list = Arrays.asList("m,k,l,a","1,3,5,7");
List<String> listNew = list.stream().flatMap(s -> {
// 将每个元素转换成一个stream
String[] split = s.split(",");
Stream<String> s2 = Arrays.stream(split);
return s2;
}).collect(Collectors.toList());

五、归约(reduce)

List<Integer> list = Arrays.asList(1, 3, 2, 8, 11, 4);
// 求和方式1
Optional<Integer> sum = list.stream().reduce((x, y) -> x + y);
// 求和方式2
Optional<Integer> sum2 = list.stream().reduce(Integer::sum);
// 求和方式3 reduce的第一个参数是Integer类型
Integer sum3 = list.stream().reduce(0, Integer::sum);
// 求乘积
Optional<Integer> product = list.stream().reduce((x, y) -> x * y);
// 求最大值方式1
Optional<Integer> max = list.stream().reduce((x, y) -> x > y ? x : y);
Optional<Integer> max1= list.stream().reduce(Integer::max);
// 求最大值写法2
Integer max2 = list.stream().reduce(0, Integer::max);

六、收集(collect)

6.1归集(toList/toSet/toMap)

List<Integer> list = Arrays.asList(1, 6, 3, 4, 6, 7, 9, 6, 20);
List<Integer> listNew = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
Set<Integer> set = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toSet());
List<Person> personList = new ArrayList<Person>();
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"));
Map<?, Person> map = personList.stream().filter(p -> p.getSalary() > 8000).collect(Collectors.toMap(Person::getName, p -> p));//第二个参数可以用Function.identify();代替

6.2统计(count/averaging)

List<Person> personList = new ArrayList<Person>();
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"));
// 求总数
Long count = personList.stream().collect(Collectors.counting());
long count1 = personList.stream().count();
// 求平均工资
Double average = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));
Integer sumSalary = personList.stream().map(Person::getSalary).reduce(0, Integer::sum);
long average1 = sumSalary / count1;
// 求最高工资
Optional<Integer> max = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));
Integer max1 = personList.stream().map(Person::getSalary).reduce(0, Integer::max);
// 求工资之和
Integer sum = personList.stream().collect(Collectors.summingInt(Person::getSalary));
// 一次性统计所有信息
DoubleSummaryStatistics collect = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));

6.3分组(partitioningBy/groupingBy)

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"));
Map<String, List<Person>> sexGroup = personList.stream().collect(Collectors.groupingBy(Person::getSex));
Map<String, Map<String, List<Person>>> areaGroup = personList.stream().collect(Collectors.groupingBy(Person::getSex,Collectors.groupingBy(Person::getArea)));

6.4接合(joining)

personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
personList.add(new Person("Anni", 8200, 24, "female", "New York"));
String stringStream = personList.stream().map(n -> n.getName()).collect(Collectors.joining("--"));
String collect = personList.stream().map(Person::getSex).collect(Collectors.joining("-"));

6.5归约(reducing)

Collectors类提供的reducing方法,相比于stream本身的reduce方法,增加了对自定义归约的支持。
personList.add(new Person("Anni", 8200, "female", "New York"));
personList.add(new Person("Owen", 9500, "male", "New York"));
Integer reduce = personList.stream().map(Person::getSalary).reduce(0, Integer::sum);
Integer collect = personList.stream().collect(Collectors.reducing(0, Person::getSalary, Integer::sum));

6.6排序(sorted)

personList.add(new Person("Alisa", 9200, 22, "female", "New York"));
// //按照工资顺序排列
List<String> collect = personList.stream().sorted(Comparator.comparing(Person::getSalary)).map(Person::getName).collect(Collectors.toList());
// //按照工资倒序排列
// List<String> collect1 = personList.stream().sorted(Comparator.comparing(Person::getSalary).reversed()).map(Person::getName).collect(Collectors.toList());
List<String> s = personList.stream().sorted(Comparator.comparing(Person::getSalary).thenComparing(Person::getAge)).map(Person::getName).collect(Collectors.toList());
List<String> c= personList.stream().sorted(Comparator.comparing(Person::getSalary).thenComparing(Person::getAge).reversed()).map(Person::getName).collect(Collectors.toList());

6.7提取/组合

String[] s1 = { "a", "b", "c", "d" };
String[] s2 = { "d", "e", "f", "g" };
Stream<String> stream1 = Stream.of(s1);
Stream<String> stream2 = Stream.of(s2);
// concat:合并两个流 distinct:去重
List<String> newList = Stream.concat(stream1, stream2).distinct().collect(Collectors.toList());
// limit:限制从流中获得前n个数据
List<Integer> collect = Stream.iterate(1, x -> x + 2).limit(10).collect(Collectors.toList());
// skip:跳过前n个数据
List<Integer> collect2 = Stream.iterate(1, x -> x + 2).skip(1).limit(5).collect(Collectors.toList());