本文曾经收录到 Github 仓库,该仓库蕴含 计算机根底、Java 根底、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享 等外围知识点,欢送 star~
Github 地址
如果拜访不了 Github,能够拜访 gitee 地址。
gitee 地址
Java8 新增的 Stream 流大大加重了咱们代码的工作量,然而 Stream 流的用法较多,理论应用的时候容易忘记,整顿一下供大家参考。
1. 概述
Stream 应用一种相似用 SQL 语句从数据库查问数据的直观形式来对 Java 汇合运算和表白的高阶形象。
Stream API 能够极大进步 Java 程序员的生产力,让程序员写出高效率、洁净、简洁的代码。
这种格调将要解决的元素汇合看作一种流,流在管道中传输,并且能够在管道的节点上进行解决,比方筛选,排序,聚合等。
2. 创立
2.1 汇合自带 Stream 流办法
List<String> list = new ArrayList<>();
// 创立一个程序流
Stream<String> stream = list.stream();
// 创立一个并行流
Stream<String> parallelStream = list.parallelStream();
2.1 通过 Array 数组创立
最全面的 Java 面试网站
int[] array = {1,2,3,4,5};
IntStream stream = Arrays.stream(array);
2.3 应用 Stream 的静态方法创立
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> stream = Stream.iterate(0, (x) -> x + 3).limit(3); // 输入 0,3,6
Stream<String> stream = Stream.generate(() -> "Hello").limit(3); // 输入 Hello,Hello,Hello
Stream<Double> stream = Stream.generate(Math::random).limit(3); // 输入 3 个随机数
2.3 数值流
// 生成无限的常量流
IntStream intStream = IntStream.range(1, 3); // 输入 1,2
IntStream intStream = IntStream.rangeClosed(1, 3); // 输入 1,2,3
// 生成一个等差数列
IntStream.iterate(1, i -> i + 3).limit(5).forEach(System.out::println); // 输入 1,4,7,10,13
// 生成有限常量数据流
IntStream generate = IntStream.generate(() -> 10).limit(3); // 输入 10,10,10
另外还有 LongStream、DoubleStream 都有这几个办法。
3. 应用
初始化一些数据,示例中应用。
public class Demo {
class User{
// 姓名
private String name;
// 年龄
private Integer age;
}
public static void main(String[] args) {List<User> users = new ArrayList<>();
users.add(new User("Tom", 1));
users.add(new User("Jerry", 2));
}
}
3.1 遍历 forEach
// 循环输入 user 对象
users.stream().forEach(user -> System.out.println(user));
3.2 查找 find
// 取出第一个对象
User user = users.stream().findFirst().orElse(null); // 输入 {"age":1,"name":"Tom"}
// 随机取出任意一个对象
User user = users.stream().findAny().orElse(null);
3.3 匹配 match
// 判断是否存在 name 是 Tom 的用户
boolean existTom = users.stream().anyMatch(user -> "Tom".equals(user.getName()));
// 判断所有用户的年龄是否都小于 5
boolean checkAge = users.stream().allMatch(user -> user.getAge() < 5);
3.4 筛选 filter
// 筛选 name 是 Tom 的用户
users.stream()
.filter(user -> "Tom".equals(user.name))
.forEach(System.out::println); // 输入 {"age":1,"name":"Tom"}
3.5 映射 map/flatMap
// 打印 users 里的 name
users.stream().map(User::getName).forEach(System.out::println); // 输入 Tom Jerry
// List<List<User>> 转 List<User>
List<List<User>> userList = new ArrayList<>();
List<User> users = userList.stream().flatMap(Collection::stream).collect(Collectors.toList());
3.6 归约 reduce
// 求用户年龄之和
Integer sum = users.stream().map(User::getAge).reduce(Integer::sum).orElse(0);
// 求用户年龄的乘积
Integer product = users.stream().map(User::getAge).reduce((x, y) -> x * y).orElse(0);
3.7 排序 sorted
// 按年龄倒序排
List<User> collect = users.stream()
.sorted(Comparator.comparing(User::getAge).reversed())
.collect(Collectors.toList());
// 多属性排序
List<Person> result = persons.stream()
.sorted(Comparator.comparing((Person p) -> p.getNamePinyin())
.thenComparing(Person::getAge)).collect(Collectors.toList());
3.8 收集 collect
// list 转换成 map
Map<Integer, User> map = users.stream()
.collect(Collectors.toMap(User::getAge, Function.identity()));
// 按年龄分组
Map<Integer, List<User>> userMap = users.stream().collect(Collectors.groupingBy(User::getAge));
// 求平均年龄
Double ageAvg = users.stream().collect(Collectors.averagingInt(User::getAge)); // 输入 1.5
// 求年龄之和
Integer ageSum = users.stream().collect(Collectors.summingInt(User::getAge));
// 求年龄最大的用户
User user = users.stream().collect(Collectors.maxBy(Comparator.comparing(User::getAge))).orElse(null);
// 把用户姓名拼接成逗号分隔的字符串输入
String names = users.stream().map(User::getName).collect(Collectors.joining(",")); // 输入 Tom,Jerry
3.9 List 转换成 Map 时遇到反复主键
这样转换会报错,因为 ID 反复。
能够这样做
好货色应该要分享进去!我把本人学习计算机多年以来的书籍分享进去了,汇总到一个 计算机经典编程书籍 仓库了,一共 300 多本,包含 C 语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生 等,能够 star 一下,下次找书间接在下面搜寻,仓库继续更新中~
Github 地址