本文曾经收录到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地址
发表回复