Java8新特性:Stream API

1 简介

Stream API (java.util.Stream)将集合和数组抽象成流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

Stream操作主要有三个步骤:

  • 1.创建Stream
    一个数据源(集合、数组),获取一个流。
  • 2.中间操作
    中间操作链,对数据源的数据进行处理:筛选, 排序等。
  • 3.终止操作
    执行终止操作时才会执行中间操作链,且一个流执行只能执行一次终止操作。

2 创建Stream

  • 数组创建流
    Arrays.stream(T[] array):返回Stream<T>,对于基本类型数组(int, long, double),返回IntStreamLongStreamDoubleStream
  • 集合创建流
    stream(): 集合对象调用该方法创建串行流

3 中间操作

  • filter(Predicate predicate):过滤掉返回false的元素
  • distinct():筛选,通过hashCode()和equals()出去重复元素
  • limti(long maxSize):断截流,使其元素不超过给定数量
  • skip(long n):返回跳过前n个元素的流
  • map(Function mapper):每个元素通过Function函数式接口,映射成另一个元素
  • mapToXxx(ToXxxFunction mapper): 元素映射,产生新的流XxxStream
  • sorted(Comparator com):元素排序,产生新的流,如未输入参数,则按自然排序。

除了上述操作,对于IntStream等还有的操作:

  • boxed():对基本类型“装箱”
  • average():对元素求平均
  • sum():对元素求和

4 终止操作

  • foreach(Consumer action):迭代操作流的每个元素
  • count():返回流中元素总数
  • max(Comparator c):返回流中最大值
  • min(Comparator c):返回流中最小值
  • reduce(BinaryOperator accumulator):将流中元素反复结合起来,得到一个值(Optional<T>)
  • toArray(IntFunction<A[]> generator):不带generator参数时将流元素存入Object[],带参数时存入A[]
toArray(size -> new A[size]) // 结果返回 A[] 数组
toArray(A[]::new)				 // 与上面等价
  • collect(Collector c):将流转化为其他形式(汇总)

    常见的Collector由Collectors提供:

    • toList() --> List<T>:把流中元素收集到List
    • toSet() --> Set<T>:把流中元素收集到Set
    • toMap() --> Map<K, V>:把流中元素收集到Map

5 示例

示例一:随机生成长度为10范围在[10, 20)的int[]数组:

Random rand = new Random();
int[] arr = rand.ints(10, 20).limit(10).toArray();

示例二:int[]数组 ----> List<Integer> 集合

// int[] --> List<Integer>
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
System.out.println("---------- int[] --> List<Integer> -----------------");
list.forEach(System.out::println);

示例三:List<Integer>集合 —> Integer[]数组

// List<Integer> --> Integer[]
Integer[] arr2 = list.stream().toArray(Integer[]::new);
System.out.println("---------- List<Integer> --> Integer[] -----------------");
Arrays.stream(arr2).map(item -> item+", ").forEach(System.out::print);
System.out.println();

示例四:List<Integer>集合 ----> int[]数组

// List<Integer> --> int[]
int[] arr3 = list.stream().mapToInt(Integer::valueOf).toArray();
System.out.println("---------- List<Integer> --> int[] -----------------");
Arrays.stream(arr3).mapToObj(item -> item+", ").forEach(System.out::print);

示例四:控制台输入一行数据转 int[]数组

// 输入格式为 1, 2, 3, 4, 5, 6 得到 int[] data
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
scanner.close();
String[] strs = input.replace(",", " ").split("\s+");
int[] data = Arrays.stream(strs).map(String::trim).mapToInt(Integer::valueOf).toArray();
// 按照 1, 2, 3, 4, 5, 6格式打印输出
Arrays.stream(data).limit(data.length-1).mapToObj(item -> item+", ").forEach(System.out::print);
System.out.println(data[data.length-1]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值