jdk1.8新特性Stream流处理

引言:

Stream流处理,不是IO流的处理,而是真正的函数式编程风格引入到Java中

概念

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

Stream API 实际应用

如何生产Stream
在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 为集合创建串行流。

  • parallelStream() − 为集合创建并行流。

List为例 

 List<String> list  = new ArrayList<>() ;
 list.add("东邪");
 list.add("西毒");
 list.add("南帝");
 list.add("北丐");

Stream API 使用

forEach

Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据

 // 遍历集合
 list.stream().forEach((x)->{
      System.out.println(x);
  });

filter

filter方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出等于南帝的字符串

  List collect1 = list.stream()
                .filter(x -> "南帝".equalsIgnoreCase(x)).collect(Collectors.toList());
 System.out.println(collect1);

 

limit

limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 3 条数据:

//输出
list.stream().limit(3).forEach(s -> System.out.println(s));
//转成list
List<String> collect2 = list.stream().limit(3).collect(Collectors.toList());
        System.out.println(collect2);

skip

根据指定下标向后取值,包含指定下标

 List limitNum2 = list.stream().skip(1).collect(Collectors.toList());
        System.out.println(limitNum2);

sorted

sorted 方法用于对流进行排序,一般在skip/limit或者filter之后进行

 list.stream().sorted().forEach(System.out::println);

min/max/distinct

distinct 去重,这里不做演示

String s = list.stream().min((x,y)-> x.hashCode() - y.hashCode()).get();
System.out.println(s);

 String s2 = list.stream().max(Comparator.comparingInt(String::hashCode)).get();
 System.out.println(s2);

扩展
 

 *  1. 聚合操作
 *
 *  2. stream的处理流程
 *      数据源
 *      数据转换
 *      获取结果
 *  3. 获取Stream对象
 *      1. 从集合或者数组中获取[**]
 *          Collection.stream(),如accounts.stream()
 *          Collection.parallelStream()
 *          Arrays.stream(T t)
 *      2. BufferReader
 *          BufferReader.lines()-> stream()
 *      3. 静态工厂
 *          java.util.stream.IntStream.range()..
 *          java.nio.file.Files.walk()..
 *      4. 自定构建
 *          java.util.Spliterator
 *      5. 更多的方式..
 *          Random.ints()
 *          Pattern.splitAsStream()..
 *   4. 中间操作API{intermediate}
 *      操作结果是一个Stream,中间操作可以有一个或者多个连续的中间操作,需要注意的是,中间操作
 *          只记录操作方式,不做具体执行,直到结束操作发生时,才做数据的最终执行。
 *          中间操作:就是业务逻辑处理。
 *      中间操作过程:无状态:数据处理时,不受前置中间操作的影响。
 *                      map/filter/peek/parallel/sequential/unordered
 *                  有状态:数据处理时,受到前置中间操作的影响。
 *                      distinct/sorted/limit/skip
 *   5. 终结操作|结束操作{Terminal}
 *      需要注意:一个Stream对象,只能有一个Terminal操作,这个操作一旦发生,就会真实处理数据,生成对应的处理结果。
 *      终结操作:非短路操作:当前的Stream对象必须处理完集合中所有 数据,才能得到处理结果。
 *                  forEach/forEachOrdered/toArray/reduce/collect/min/max/count/iterator
 *              短路操作:当前的Stream对象在处理过程中,一旦满足某个条件,就可以得到结果。
 *                  anyMatch/allMatch/noneMatch/findFirst/findAny等
 *                  Short-circuiting,无限大的Stream-> 有限大的Stream。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Stream是在Java 8之后增的一个特性,它是用来操作集合(Collection)的工具。Stream提供了一种简洁、高效的方式来对集合进行处理和操作。Stream可以用于遍历集合中的元素、进行过滤、映射、排序、聚合等各种操作。 在使用Stream时,常用的方法之一是forEach()方法,它用来遍历Stream中的数据。这个方法是一个终结方法,一旦调用了forEach()方法,就不能再继续调用Stream中的其他方法了。例如,下面的代码演示了如何使用forEach()方法遍历一个Stream并打印其中的元素: ``` List<String> list = Arrays.asList("字节","网易","百度", "美团", "阿里", "字节"); Stream<String> stream = list.stream(); stream.forEach(System.out::println); ``` 执行以上代码会依次打印出集合中的元素:"字节"、"网易"、"百度"、"美团"、"阿里"、"字节"。 除了forEach()方法之外,Stream还提供了许多其他常用的方法,比如filter()用于过滤元素、map()用于映射元素、sorted()用于排序元素、reduce()用于聚合元素等等。这些方法可以根据具体的需求来选择使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JDK1.8常见的Stream](https://blog.csdn.net/TFHoney/article/details/129687717)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值