Java8 Stream流 使用笔记

简介: Java8 Stream流 使用笔记

1、快速将List< Object >转换为Map< Field, Object >

List<CanvasComponentSettings> list = service.queryCanvasComponentSettingList(componentCodeList);
Map<String, CanvasComponentSettings> map = list.stream().collect(Collectors.toMap(CanvasComponentSettings::getComponentCode, item -> item));

如果Field中有相同的,使用上面的写法就会报错

List<User> userList = Lists.newArrayList(
        new User().setId("A").setName("张三"),
        new User().setId("A").setName("李四"),
        new User().setId("C").setName("王五")
        );
Map<String, User> collect = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
System.out.println(collect);

这时就需要调用第二个重载方法,传入合并函数,如:

userList.stream().collect(Collectors.toMap(User::getId, User::getName, (e1, e2) -> e1 + e2));
// 输出结果:
A-> 张三李四 
C-> 王五

2、filter过滤

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
list = list.stream().filter(e -> !("aaa".equals(e) || "ccc".equals(e))).collect(Collectors.toList());
list.forEach(e -> {
    System.out.println(e);
});

3、map映射

对原list做某种处理,得到一个新的映射list

List<User> userList = userDao.selectByUserId(user.getId());
List<Long> userIds = userList.stream().map(User::getId).collect(Collectors.toList());

所有元素,按某种规律计算:

List<Integer> num = Arrays.asList(1,2,3,4,5);
List<Integer> collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(collect1); //[2, 4, 6, 8, 10]

4、peek设置值

// 考生号或身份证号是否必填
List<ExamineInfoVo> fail = examineInfoVos.stream()
        .filter(e -> StringUtils.isAnyEmpty(e.getExamineNumber(), e.getIdCard()))
        .peek(e -> e.setReason("考生号或身份证号未正确填写"))
        .collect(Collectors.toList());

5、collect收集结果为集合

// 把结果收集为List
List<String> toList = list.stream().map(Person::getAddress).collect(Collectors.toList());
System.out.println(toList);
// 把结果收集为Set(去重)
Set<String> toSet = list.stream().map(Person::getAddress).collect(Collectors.toSet());
System.out.println(toSet);
// 把结果收集为Map,前面的是key,后面的是value,如果你希望value是具体的某个字段,可以改为toMap(Person::getName, person -> person.getAge())
Map<String, Person> nameToPersonMap = list.stream().collect(Collectors.toMap(Person::getName, person -> person));
System.out.println(nameToPersonMap);
// 把结果收集起来,并用指定分隔符拼接
String result = list.stream().map(Person::getAddress).collect(Collectors.joining("~"));
System.out.println(result);

分组收集

Map<String, List<Books>> collect = books.stream().collect(Collectors.groupingBy(Books::getAuthor));

多字段分组收集

// GROUP BY address, age
Map<String, Map<Integer, List<Person>>> doubleGroupingBy = list.stream()
        .collect(Collectors.groupingBy(Person::getAddress, Collectors.groupingBy(Person::getAge)));
System.out.println(doubleGroupingBy);
// 简单来说,就是collect(groupingBy(xx)) 扩展为 collect(groupingBy(xx, groupingBy(yy))),嵌套分组
// 解决了按字段分组、按多个字段分组,我们再考虑一个问题:有时我们分组的条件不是某个字段,而是某个字段是否满足xx条件
// 比如 年龄大于等于18的是成年人,小于18的是未成年人
Map<Boolean, List<Person>> adultsAndTeenagers = list.stream().collect(Collectors.partitioningBy(person -> person.getAge() >= 18));
System.out.println(adultsAndTeenagers);

6、flatMap

flatMap()的作用是对流中的元素进行1对多的转换,然后将结果元素展开为新的流(相当于双层for循环)

1)合并集合

List<Integer> a = Arrays.asList(1, 2, 3);
List<Integer> b = Arrays.asList(4, 5, 6);
List<Integer> mergeList = Stream.of(a, b).flatMap(e -> e.stream()).collect(Collectors.toList());
System.out.println(mergeList);// [1, 2, 3, 4, 5, 6]

2)过滤集合

3)打散数组集合

7、sorted排序

List<String> list = Arrays.asList("c", "e", "a", "d", "b");
list.stream().sorted().forEach(System.out::println);//abcde

8、distinct去重

Stream<String> stream = Stream.of("know", "is", "know", "noknow", "is", "noknow");
stream.distinct().forEach(System.out::println); // know is noknow

9、anyMatch、allMatch

List<String> list = Arrays.asList("you", "give", "me", "stop");
List<String> list2 = Arrays.asList("me", "me", "me", "me");
boolean result = list.parallelStream().anyMatch(e -> e.equals("me"));//true
boolean result2 = list.parallelStream().allMatch(e -> e.equals("me"));//false
boolean result3 = list.parallelStream().anyMatch(e -> e.equals("mei"));//false
boolean result4 = list2.parallelStream().anyMatch(e -> e.equals("me"));//true
boolean result5 = list2.parallelStream().allMatch(e -> e.equals("me"));//true
目录
相关文章
|
6天前
|
安全 Java 大数据
|
6天前
|
Java Unix Windows
|
4天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
4天前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第17天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁。Stream API是一种用于处理集合的新工具,它提供了一种高效且易于使用的方式来处理数据。通过结合使用这两个特性,我们可以编写出更加简洁、高效的Java代码。
13 0
|
6天前
|
安全 Java API
Java Stream API详解与使用
Java Stream API是Java 8引入的特性,提供函数式操作处理集合,支持链式操作和并行处理,提升代码可读性和性能。关键点包括:延迟执行的中间操作(如filter, map)和触发计算的终端操作(如collect, forEach)。示例展示了如何从Person列表过滤出年龄大于20的姓名并排序。使用Stream时注意避免中间操作的副作用,终端操作后Stream不能复用,以及并行操作的线程安全性。
12 1
|
3天前
|
安全 Java API
Java进阶-Java Stream API详解与使用
效、更易于维护的代码,同时享受到函数式编程带来的好处。
12 2
|
3天前
|
Java 大数据 API
利用Java Stream API实现高效数据处理
在大数据和云计算时代,数据处理效率成为了软件开发者必须面对的重要挑战。Java 8及以后版本引入的Stream API为开发者提供了一种声明式、函数式的数据处理方式,极大提升了数据处理的效率和可读性。本文将详细介绍Java Stream API的基本概念、使用方法和性能优势,并通过实际案例展示如何在实际项目中应用Stream API实现高效数据处理。
|
4天前
|
Java
Java8 Stream 用法合集
Java8 Stream 用法合集
|
6天前
|
Java API
Java 8新特性之Lambda表达式与Stream API实践指南
【5月更文挑战第15天】 随着Java语言的不断发展,Java 8作为一个重要的版本,引入了许多令人兴奋的新特性。其中,Lambda表达式和Stream API是Java 8最受关注的两个特性。本文将深入探讨Lambda表达式的基本概念、语法和使用场景,以及如何结合Stream API实现更加简洁、高效的代码编写。通过实例演示,帮助读者快速掌握这两个新特性,提高Java编程能力。
|
6天前
|
Java API 数据处理
Java一分钟之-Stream API:数据处理新方式
【5月更文挑战第13天】Java 8的Stream API为集合操作提供了声明式编程,简化数据处理。本文介绍了Stream的基本概念、常见问题和易错点。问题包括并行流与顺序流的区别,状态改变操作的影响,以及忘记调用终止操作和误用`peek()`。理解并合理使用Stream API能提升代码效率和可维护性。实践中不断探索,将发掘更多Stream API的潜力。
12 3