一、Java Stream流概述
在Java 8中,得益于 Lambda 所带来的函数式编程, 引入了一个全新的 Stream 流概念。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找/筛选/过滤、排序、聚合和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
目的:用于简化集合和数组操作的API。
二、Stream的用法
Stream流的常用方法
字符流过滤、收集方法
List<String> strList = Arrays.asList("green", "red", "blue", "black", "yellow");
//过滤
List<String> collect = strList.stream()
.filter(s -> s.equals("green") || s.equals("red"))
.collect(Collectors.toList());
System.out.println(collect);
//控制台输出: [green, red]
对象类型过滤
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String name;
private Integer age;
private String address;
}
以下代码会涉及filter、collect、max、min、map等的用法
@Test
public void test2() {
//对象类型过滤
List<Person> personList = new ArrayList<>();
personList.add(new Person("张三",10,"shanghai"));
personList.add(new Person("李四",22,"beijing"));
personList.add(new Person("王五",34,"guangzhou"));
personList.add(new Person("武大郎",55,"tianjin"));
personList.add(new Person("欧阳司马",55,"guangzhou"));
//获取30岁以上及居住在guangzhou的人
List<Person> collect = personList.stream()
.filter(person -> person.getAge() > 30)
.collect(Collectors.toList());
System.out.println(collect);
/*
控制台输出: [Person(name=王五, age=34, address=guangzhou),
Person(name=欧阳司马, age=55, address=guangzhou)]
*/
//筛选出年纪最大的人
Optional<Person> max = personList.stream()
.max(Comparator.comparing(Person::getAge));
System.out.println(max.get());
//控制台输出:Person(name=武大郎, age=55, address=tianjin)
//筛选出年纪最小的人
Optional<Person> min = personList.stream()
.min(Comparator.comparing(Person::getAge));
System.out.println(min.get());
//控制台输出:Person(name=张三, age=10, address=shanghai)
//同时计算长度、最大值、最小值、平均值
IntSummaryStatistics intCollect = personList.stream()
.collect(Collectors.summarizingInt(Person::getAge));
System.out.println(intCollect);
//控制台输出:IntSummaryStatistics{count=5, sum=176, min=10, average=35.200000,
max=55}
//求年纪的和
System.out.println(intCollect.getSum());
//控制台输出: 176
//求年纪的和还可以这样来实现
Optional<Integer> reduce = personList.stream()
.map(person -> person.getAge()).reduce(Integer::sum);
System.out.println(reduce.get());
//控制台输出: 176
}
以下代码承接以上,涉及toList、toMap、toSet等的用法
//toList的用法,把年纪组成一个集合里面
List<Integer> integers = personList.stream()
.map(person -> person.getAge()).collect(Collectors.toList());
System.out.println(integers);
//以名字为key,年龄为value组合一个Map集合
Map<String, Integer> integerMap = personList.stream()
.collect(Collectors.toMap(Person::getName, Person::getAge));
System.out.println(integerMap);
//输出: {李四=22, 张三=10, 武大郎=55, 欧阳司马=55, 王五=34}
//toSet,把年纪组成一个set集合里面
Set<Integer> integerSet = personList.stream()
.map(person -> person.getAge()).collect(Collectors.toSet());
System.out.println(integerSet);
//输出:[34, 22, 55, 10] 注意:因为set集合里面的数据不可重复,所以重复的数据只有1个
以上是Stream的常见用法,如果对您的学习和工作有所帮助,请关注一下本人的账号及点赞一下,谢谢!