StreamAPI详细操作

一、概述

1、作用

高效处理集合数据的API方法,仅负责处理数据而不负责保存数据。

中文可翻译为流式编程。

2、结构

StreamAPI在使用时分成三个部分:

  • 第一部分:创建Stream对象
  • 第二部分:数据的链式处理
  • 第三部分:结束操作

3、特点

  • 延迟执行:中间部分并不是立即执行,而是调用最终结束操作时才执行。如果没有最终结束操作则不执行。
  • 一次性使用:一个Stream对象一旦调用了最终结束操作则无法再使用,必须重新创建才行。

二、操作

1、创建Stream对象

方式很多,这里我们重点关注两种形式:

  • 串行流:java.util.Collection.stream()
  • 并行流:java.util.Collection.parallelStream()

2、数据处理

①映射

Stream对象的map()方法接收Function类型的参数,集合中的每一个元素传入Function接口apply()方法,apply()方法内部可以对传入的集合元素做任意操作,最后提供一个返回值。

简单来说就是可以把集合元素映射为新的值。

List<String> nameList = Arrays.asList("aa","bb","cc","dd","ee");

nameList.stream().map(name -> name + "@").forEach(System.out::println);

②过滤

对每一个集合元素进行过滤,返回true的会被保留。

List<String> nameList = Arrays.asList("张飞","赵云","吕布","赵干","马超","甘宁");
nameList.stream().filter(name -> name.startsWith("赵")).forEach(System.out::println);

③去重

List<String> nameList = Arrays.asList("张飞","赵云","吕布","赵云","赵云","马超","赵云","甘宁");
nameList.stream().distinct().forEach(System.out::println);

④排序

无参的sort()方法是自然排序,默认是升序。此时要求被排序的数据类型实现了Comparable接口。

Arrays.asList("aa","bb","cc","dd","ee")
        .stream()
        .sorted()
        .forEach(System.out::println);

有参的sort()方法是定制化排序,根据Comparator对象排序:

Arrays.asList(25,36,17,22,18,5,13,-4,86)
        .stream()
        .sorted(Integer :: compareTo)
        .forEach(System.out::println);

降序排序:

Arrays.asList(25,36,17,22,18,5,13,-4,86)
        .stream()
        .sorted(Comparator.reverseOrder())
        .forEach(System.out::println);

⑤截取

从开头开始截取指定数量的元素:

Arrays.asList(25,36,17,22,18,5,13,-4,86)
        .stream()
        .sorted()
        .limit(5)
        .forEach(System.out::println);

3、结束操作

在一个流中,结束操作只能有一个。

①forEach()

遍历经过中间处理之后的集合元素。

Arrays.asList(25,36,17,22,18,5,13,-4,86)
        .stream()
        .sorted()
        .limit(5)
        .forEach(System.out::println);

toArray()

把经过处理后的集合数据转换为数组。

Object[] objects = Arrays.asList(25, 36, 17, 22, 18, 5, 13, -4, 86)
        .stream()
        .sorted()
        .toArray();

③max()/min()

找出最大、最小元素。

Optional<Integer> optional = Arrays.asList(25, 36, 17, 22, 18, 5, 13, -4, 86)
        .stream()
        .max(Comparator.comparingInt(value0 -> value0));

Integer maxValue = optional.orElse(1000000);
System.out.println("maxValue = " + maxValue);

④count()

返回流中元素的个数。

long count = Arrays.asList(25, 36, -17, 22, -18, 5, 13, -4, 86)
        .stream()
        .filter(value -> value > 0)
        .count();
System.out.println("count = " + count);

⑤reduce()

归纳

Integer value = Arrays.asList(25, 36, -17, 22, -18, 5, 13, -4, 86)
        .stream()
        .reduce(Integer::sum)
        .get();

System.out.println("value = " + value);

anyMatch()/allMatch()/noneMatch()

  • anyMatch():返回boolean值,表示流中的集合元素是否有任何一个匹配断言
  • allMatch():返回boolean值,表示流中的集合元素是否全部匹配断言
  • noneMatch():返回boolean值,表示流中的集合元素是否全部都不匹配断言
boolean matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
        .stream()
        .anyMatch(name -> name.startsWith("赵"));
System.out.println("matchResult = " + matchResult);

matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
        .stream()
        .allMatch(name -> name.startsWith("赵"));
System.out.println("matchResult = " + matchResult);

matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
        .stream()
        .allMatch(name -> name.length() == 2);
System.out.println("matchResult = " + matchResult);

matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
        .stream()
        .noneMatch(name -> name.startsWith("赵"));
System.out.println("matchResult = " + matchResult);

matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
        .stream()
        .noneMatch(name -> name.startsWith("趴"));
System.out.println("matchResult = " + matchResult);

collect()

[1]方法声明

  • 常用:<R, A> R collect(Collector<? super T, A, R> collector);
  • 不常用:
    <R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);

[2]用法

给collect()方法传入下列不同对象参数,可以有不同效果:

参数作用
Collectors.toList()把流中的数据转换为List
Collectors.toSet()把流中的数据转换为Set
Collectors.toMap(name -> name, value -> value)把流中的数据转换为Map<br>我们需要通过函数型接口提供键和值
Collectors.groupingBy(name -> name.substring(0, 1))根据指定规则对集合数据分组
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值