课程学习--JavaSE--后端(第11期):Java8新特性--Stream

流(Stream)

流是一种数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。

操作流的步骤

  1. 创建

    从一个数据源中,获取流。

  2. 中间操作

    对流进行处理

  3. 终止操作

    生成结果

创建流

  1. 通过Collection接口提供的stream和parallelStream方法

    List<String> list = new ArrayList<>();
    Stream<String> stringStream = list.stream();
    Stream<String> stringParalleStream = list.parallelStream();
    
  2. 通过Arrays类提供的stream方法

    Integer[] integers = new Integer[10];
    Stream<Integer> integerStream = Arrays.stream(integers);
    
  3. 通过Stream接口中的静态方法of

    Stream<String> stream = Stream.of("aa", "bb", "cc");
    
  4. 创建无限流

    Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2);
    iterate.limit(10).forEach(System.out::println);
    
  5. 通过Stream接口中的静态方法generate

    Stream.generate(() -> Math.random()).limit(5).forEach(System.out::println);
    

中间操作

筛选与切片
过滤(filter)
filter(i -> i > 5)
限制数量(limit)
// 短路
limit(5)
按顺序跳过(skip)
skip(1)
去重(distinct)
distinct()
映射
映射(map)
map(i -> i * i)
扁平化映射(flatMap)
List<String> stringList = Arrays.asList("cc", "aa", "bb","dd", "ee", "ff", "gg","hh","ii", "jj", "kk", "ll");

Stream<Character> characterStream = stringList.stream().flatMap(StreamApi::slipChar);
characterStream.forEach(System.out::println);

public static Stream<Character> slipChar(String string) {
    List<Character> list = new ArrayList<>();

    for (Character ch : string.toCharArray()) {
    list.add(ch);
    }

    return list.stream();
}
排序
自然排序
stringList.stream()
        .sorted()
        .forEach(System.out::println);
定制排序
integerList.stream()
        .sorted((x, y ) -> -Integer.compare(x, y))
        .forEach(System.out::println);

终止操作

查找与匹配
匹配所有
boolean allMatch(Predicate<? super T> predicate);
匹配一个
boolean anyMatch(Predicate<? super T> predicate);
确认排除
boolean noneMatch(Predicate<? super T> predicate);
返回首元素
Optional<T> findFirst();
返回随机
Optional<T> findAny();
返回数量
long count();
返回最大值
// 传入比较器
Optional<T> max(Comparator<? super T> comparator);
返回最小值
// 传入比较器
Optional<T> min(Comparator<? super T> comparator);
归约与收集
归约

将流中的元素反复结合起来,得到一个值。


List<Integer> integerList = Arrays.asList(5, 6, 8, 8, 9, 10, 11 , 12, 7, 1, 4, 3, 2);
// 数列累加
Integer sum = integerList.stream()
    	// x=0, y=5
        .reduce(0, (x, y) -> x+y);
System.out.println("sum:"+sum);
收集

将流转换为其他格式,接受一个Collector接口实现,用于给Stream中的元素做汇总方法。

List<String> stringList = Arrays.asList("cc", "aa", "bb","dd", "ee", "ff", "gg","hh","ii", "jj", "kk", "ll");
Stream<Character> characterStream = stringList.stream().flatMap(StreamApi::slipChar);
List<Character> characters = characterStream.collect(Collectors.toList());
characters.forEach(System.out::println);
Collectors工具类常用方法
  • 求数量-counting
  • 求平均-averagingDouble
  • 累加-summingDouble
  • 取最大值-maxBy(Comparator<? super T> comparator)
  • 分组-groupingBy
  • 分区-partitioningBy
  • 连接-joining
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

charliejohn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值