java8新特性——Stream流

野性酷女 2023-10-13 08:15 221阅读 0赞

目录

Stream流的常用方法汇总:

常用方式

1.count方法:

2.filter方法:

4.limit方法:

3.concat方法

5、sorted方法(排序)

6、收集Stream流—把流转回想要转回的类型

7、parallel()

8、reduce(计算相加)


Stream流的常用方法汇总:

  • 终结方法:返回值类型不再是Stream接口本身类型的方法,例如:forEach方法和count方法
  • 非终结方法/延迟方法:返回值类型仍然是Stream接口自身类型的方法,除了终结方法都是延迟方法。例如:filter,limit,skip,map,conat







































































方法名称 方法作用 方法种类 是否支持链式调用
count 统计个数 终结方法
forEach 逐一处理 终结方法
filter 过滤 函数拼接
limit 取用前几个 函数拼接
skip 跳过前几个 函数拼接
map 映射 函数拼接
concat 组合 函数拼接
sorted 排序 函数拼接
skip( long n) 丢弃流的第一个 n元素 函数拼接
reduce 函数计算 函数拼接

常用方式

1.count方法:

long count (); 统计流中的元素,返回long类型数据

  1. List<String> list = new ArrayList<>();
  2. list.add("张老三");
  3. list.add("张小三");
  4. list.add("李四");
  5. list.add("赵五");
  6. list.add("张六");
  7. list.add("王八");
  8. long count = list.stream().count();
  9. System.out.println("集合中的元素个数是:" + count);
  10. 输出结果:
  11. 集合中的元素个数是:6

2.filter方法:

Stream filter(Predicate<? super ?> predicate); 过滤出满足条件的元素

参数Predicate:函数式接口,抽象方法:boolean test (T t)Predicate接口:是一个判断接口

  1. // 获取stream流
  2. Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
  3. // 需求:过去出姓张的元素
  4. stream.filter(name->name.startsWith("张")).forEach(name->{
  5. System.out.println("流中的元素" + name);
  6. });

4.limit方法:

Stream limit(long maxSize); 取用前几个元素

注意: 参数是一个long 类型,如果流的长度大于参数,则进行截取;否则不进行操作

  1. // 获取流的长度
  2. Stream<String> stream1 = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
  3. // 需求:保留前三个元素
  4. stream1.limit(3).forEach((String name)->{
  5. System.out.println("流中的前三个元素是:" + name);
  6. });
  7. 输出结果:
  8. 流中的前三个元素是:张老三
  9. 流中的前三个元素是:张小三
  10. 流中的前三个元素是:李四

3.concat方法

public static Stream concat(Stream<? extends T> a, Stream<? extends T> b)—> 合并两个流

把list集合转为Map分组 ,key(属性),value(list同属性值对象)

Map<String, List<Employee>> map = emps.stream().collect(Collectors.*groupingBy*(Employee::getCity));

  1. Stream<String> stream1 = Stream.of("11","22","33","44","55");
  2. Stream<String> stream2 = Stream.of("张颜宇", "张三", "李四", "赵五", "刘六", "王七");
  3. // 需求:合并两个流
  4. Stream<String> stream = Stream.concat(stream1,stream2);
  5. stream.forEach((String name)->{
  6. System.out.print(name);
  7. });
  8. 输出结果:
  9. 1122334455张颜宇张三李四赵五刘六王七

4.分组

Collectors.groupingBy(分组条件,流对象)

流对象可进行二次操作

  1. Map<String, List<Student>> collect1 = studentStream.collect(Collectors.groupingBy(s -> {
  2. if (s.getScore() >= 60) {
  3. return "及格";
  4. } else {
  5. return "不及格";
  6. }
  7. }));
  8. //多级分组
  9. Map<Integer, Map<String, List<Student>>> collect1 = studentStream.collect(Collectors.groupingBy(Student::getScore, Collectors.groupingBy(item -> {
  10. if (item.getAge() > 60) {
  11. return "及格";
  12. } else {
  13. return "不及格";
  14. }
  15. })));

5、sorted方法(排序)

  1. List<Vo>list=list.stream()
  2. .sorted(Comparator.comparing(Vo::getName))
  3. .collect(Collectors.toList());

使用vo对象的Name字段进行排序,最后在返回集合

6、收集Stream流—把流转回想要转回的类型

List<String> collect = Stream.concat(stream2, stream).collect(Collectors.toList());

List<String> b = list2.stream()

.filter(add -> add.startsWith("张")).collect(Collectors.toList());

Stream流中提供了一个方法,可以把流中的数据收集到单例集合中

R collect(Collector<? super T, A, R> collector); 把流中的数据手机到单列集合中 返回值类型是R。R指定为什么类型,就是手机到什么类型的集合 参数Collector<? super T, A, R>中的R类型,决定把流中的元素收集到哪个集合中 参数Collector如何得到 ?,可以使用 java.util.stream.Collectors工具类中的静态方法: - public static Collector> toList():转换为List集合 - public static Collector> toSet() :转换为Set集合

  1. List<String> list2 = new ArrayList<>();
  2. list2.add("张老三");
  3. list2.add("张小三");
  4. list2.add("李四");
  5. list2.add("赵五");
  6. list2.add("张六");
  7. list2.add("王八");
  8. // 需求:过滤出姓张的并且长度为3的元素
  9. Stream<String> stream = list2.stream().filter((String name) -> {
  10. return name.startsWith("张");
  11. }).filter((String name) -> {
  12. return name.length() == 3;
  13. });
  14. // stream 收集到单列集合中
  15. List<String> list = stream.collect(Collectors.toList());
  16. System.out.println(list);
  17. // stream 手机到单列集合中
  18. Set<String> set = stream.collect(Collectors.toSet());
  19. System.out.println(set);

7、parallel()

多线程并行计算

  1. public static void main(String[] args) {
  2. Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
  3. .parallel()
  4. .reduce((a, b) -> {
  5. System.out.println(String.format("%s: %d + %d = %d",
  6. Thread.currentThread().getName(), a, b, a + b));
  7. return a + b;
  8. }).ifPresent(System.out::println);
  9. }

8、reduce(函数计算)

reduce可以通过BigDecimal实现把数值进行计算。

以add为例,可以把结果进行累计汇总。

  1. public static void main(String[] args) {
  2. User user1 = new User(new BigDecimal(100));
  3. User user2 = new User(new BigDecimal(200));
  4. List<User> list = Arrays.asList(user1, user2);
  5. BigDecimal bigDecimal = list.stream().map(User::getVal).reduce(BigDecimal::add).get();
  6. System.out.println(bigDecimal);
  7. }
  8. static class User{
  9. private BigDecimal val;
  10. public User(BigDecimal val) {
  11. this.val = val;
  12. }
  13. public void setVal(BigDecimal val) {
  14. this.val = val;
  15. }
  16. public BigDecimal getVal() {
  17. return val;
  18. }
  19. }

发表评论

表情:
评论列表 (有 0 条评论,221人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 8特性Stream

    在Java 8中,引入了新的数据处理方式——流(Stream)。流的概念类似于物理学中的流动,能够以一种高效、灵活的方式对大量数据进行操作。 以下是一些流的主要特性: 1.

    相关 Java8特性 stream

    JDK1.8的新特性 1. 前言 JDK1.8已经发布很久了,在很多企业中都已经在使用。并且Spring5、SpringBoot2.0都推荐使用JDK1.8以上版本

    相关 Java8特性Stream详解

    > Stream流是Java8新特性中实践起来最让人舒服的功能,它让我们告别了繁琐的for循环迭代,所以Stream是我们必须要掌握的一个技术特性 > 此文将带着你