java Stream类详解(附代码演示)

本文深入探讨Java Stream API,包括流与集合的区别、创建Stream、转换操作如filter、map和flatMap,以及limit、skip、concat等扩展和拼接方法。此外,还详细介绍了distinct、sorted、收集结果的方法如forEach、peek、toArray和collect,以及match、grouping和partitioning、reductions等高级特性。最后,文章讨论了原始类型stream的特性和用法。
摘要由CSDN通过智能技术生成

引言

Streams遵循"what,no how"原则。

流和集合的区别:

  1. 流不存储元素。他们可以被存储在隐式的集合中或者按命令生成。
  2. 流操作不改变源。
  3. 流操作是懒惰型的,他们只有在实际调用到的时候才会执行。

学习Stream的前提是掌握Lambda表达式!

stream的工作流:

  1. 创建stream
  2. 采用详尽的中间操作将初始的stream转换为另一个stream,即相当于链式调用
  3. 采用终止的操作产生一个结果,此后stream不再使用
  int sum = widgets.stream()
                      .filter(w -> w.getColor() == RED)
                      .mapToInt(w -> w.getWeight())
                      .sum();

stream()创建流;filter,mapToInt()转换;sum()终止。

创建Stream

流的创建主要有以下几种:

  1. Collection的实现类例如List,Set,Queue等调用stream()方法:
    Stream<String> colle = new ArrayList<String>().stream();
  1. 数组类型调用Arrays.stream()方法/可变参数类型调用Stream.of()方法:
    int[] ints = {
   1, 2, 3};
    Arrays.stream(ints);
    Arrays.stream(ints, 1, 2);//可以指定生成的起始和终点
    Stream.of(1, 2, 3);
  1. 创建一个空的流:
    Stream<String> silence = Stream.empty();
  1. 从文件读取一个流:
    Path path = Paths.get("D:\\hhh\\test.xml");
    Files.lines(path).forEach(System.out::println);
  1. 无限流,用Stream.generate方法和Stream.iterate方法:
    //常量Stream
    Stream<String> echos = Stream.generate(() -> "Echo");
    //随机数Stream
    Stream<Double> randoms = Stream.generate(Math::random);
    Stream.iterate(new Integer(1), (x)-> x+1).forEach(System.out::println);

转换

filter(),map(),flatMap()

filter()过滤

例如筛选字符串长度,通常流中的元素个数会减少。

    List<String> list = Arrays.asList("a", "ab", "ba", "c");
    list.stream()
        .filter((x)-> x.length() > 1)
        .forEach(System.out::println);
        

输出:

ab
ba

map()映射

例如大小写转换。流中元素个数不变。

    List<String> list = Arrays.asList("a&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值