Java8新特性(1)—— Stream集合运算流入门学习

废话,写在前面

  • 好久没写博客了,懒了,以后自觉写写博客,每周两三篇吧!
  • 简单记录自己的学习经历,算是对自己的一点小小的督促!
  • Java8的新特性很多,比如流处理在工作中看到很多的地方都在用,是时候扔掉笨重的for循环了!节省40%-50%代码量!Come on!

如题 (总结要点)

  • Stream API只能被消费一次,后续重复使用已建立的流会报异常!所以stream流是线程安全的!
  • 比如执行“stream.forEach(System.out::println);stream.forEach(System.out::println);”连续两次,
  • 出现java.lang.IllegalStateException: stream has already been operated upon or closed。
  • 原文链接 :

借鉴学习文章列表

1.主题

package com.jdk8.newFeatures;

import org.junit.Test;

import javax.swing.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 测试Stream 的集合流
 */
public class StreamTest01 {
    @Test
    public void test(){
       // 1-1准备初始的数据流,通过已有的集合来创建流 无存储。
             //Stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等
        List<String> strings = new ArrayList<>(Arrays.asList("111","222","333"));
        // 1-2创建Stream
        Stream stream = strings.stream();
        stream.forEach(System.out::println);
//        stream.forEach(System.out::println);   // 不加注释,会对stream操作两次,出现java.lang.IllegalStateException: stream has already been operated upon or closed

        // 1-3 或者通过已有的数据来创建Stream创建流,可以使用Stream类提供的Stream.of()方法,直接返回一个由指定元素组成的流。
        Stream<String> streamxx = Stream.of("aaa","bbb","ccc");
        streamxx.forEach(
                i->System.out.println("(2)"+i)
        );

        //2-1 filter 过滤条件  中间操作
        List<String> lists = Arrays.asList("AAA","","BBB","CCC");
        lists.stream().filter(s -> s.length()>0).forEach(i -> System.out.println("filter后:"+i));

        // 2-2 map映射 中间操作
        List<Integer> numbers = Arrays.asList(11,2,3,14,14);
        numbers.stream().map(i->i*i).forEach(i -> System.out.println("平方数后:"+i));

        // 2-3 limit/skip limit ,返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素
        System.out.println("执行limit后:");
        numbers.stream().limit(4).forEach(System.out::println);

        // 2-4 sorted 方法用于对流进行排序
        System.out.println("排序后:");
        numbers.stream().sorted().forEach(System.out::println);

        // 2-5 distinct主要用来去重,以下代码片段使用 distinct 对元素进行去重
        System.out.println("distinct 对元素进行去重: ");
        numbers.stream().distinct().forEach(System.out::println);

        // 3 Stream的最终操作 : 计算出流中元素的个数、将流装换成集合等。
        //3-1 最终结果讨论 count用来统计流中的个数
        System.out.println("count用来统计流中的元素个数: ");
        System.out.println(numbers.stream().count());

        //3-2 forEach 遍历单个子元素进行操作,ints()返回的是一个intStream()
        new Random().ints().limit(4).forEach(System.out::println);

        //3-3 collect 就是一个规约操作,可以接受各种做法作为参数,将流中的元素累计汇成集合框架中的一种,如List
        List<String> string3 = Arrays.asList("Hollis", "HollisChuang", "hollis","Hollis666", "Hello", "HelloWorld", "Hollis");
        string3  = string3.stream().filter(string -> string.startsWith("Hollis")).collect(Collectors.toList());
        System.out.println("string3的collect后的测试是:"+string3);

    }
}

测试结果

111
222
333
(2)aaa
(2)bbb
(2)ccc
filter后:AAA
filter后:BBB
filter后:CCC
平方数后:121
平方数后:4
平方数后:9
平方数后:196
平方数后:196
执行limit后:
11
2
3
14
排序后:
2
3
11
14
14
distinct 对元素进行去重:
11
2
3
14
count用来统计流中的元素个数:
5
1651256773
1647013782
-1530012352
1888788786
string3的collect后的测试是:[Hollis, HollisChuang, Hollis666, Hollis]

原文地址:https://www.cnblogs.com/zhazhaacmer/p/11520708.html

时间: 2024-11-04 15:03:08

Java8新特性(1)—— Stream集合运算流入门学习的相关文章

JAVA8新特性之 Stream API

重要的 Stream API  : java.util.Stream.* Stream提供了一种高效且简易处理数据的方式 注意:1.Stream自己不会存储元素 2.对Stream进行操作不会改变数据源,相反,会产生一个执有结果的新Stream 3.Stream操作是延迟执行的.只有进行了终止操作才会产生结果 (并行流就是把内容分成多个数据块,并用不同的线程分别处理每个数据块.在Java8 后,Stream API可以声明性的通过parallel()与sequential()在并行流与串行流(顺

java8新特性(Stream API)

Stream API的操作步骤: 1.创建Stream 2.中间操作 3.终止操作(终端操作) //1. 创建 Stream @Test public void test1(){ //1. Collection 提供了两个方法 stream() 与 parallelStream() List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); //获取一个顺序流 Stream&

乐字节-Java8新特性-接口默认方法之Stream流(下)

接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 筛选和切片 filter(T -> boolean):保留 boolean 为 true 的元素 limit(long n):返回前 n 个元素 skip(long n):去除前 n 个元素 distinct():去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的 映射 map

Java8 新特性之集合操作Stream

Java8 新特性之集合操作Stream Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作,或者大批量数据操作. 为什么要使用Stream 函数式编程带来的好处尤为明显.这种代码更多地表达了业务逻辑的意图,而不是它的实现机制.易读的代码也易于维护.更可靠.更不容易出错. 高端 使用实例: 测试数据:

java8新特性:对map集合排序

一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map.map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map,HashMap是无序的,它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度.HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为

Java8 新特性 Stream 无状态中间操作

无状态中间操作 Java8 新特性 Stream 练习实例 中间无状态操作,可以在单个对单个的数据进行处理.比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)... 过滤 filter 映射 map 扁夹化 flatMap 遍厉 peek 过滤 filter 接收一个谓词断言,boolean Pridicate< T > 根据返回值类型来确定是否过滤这一条属性. // 过滤 filter @Test public void filterTest() { list.stre

Java8 新特性 Stream 短路终端操作

短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 noneMatch 查找首个 findFirst 查找任意 findAny 匹配所有 allMatch //匹配所有 allMatch @Test public void allMatchTest() { boolean b = list.stream() //所有的商品价格都大于40 .allMatch(

Java8 新特性 Stream 非短路终端操作

非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大值 max 最小值 min 聚合 collect 计数 count 遍厉 forEach //遍厉 forEach @Test public void forEachTest() { list.stream() .forEach(iter -> //以json格式输出 System.out.prin

Java 8 新特性:Java 类库的新特性之 Stream类 ——诺诺&quot;涂鸦&quot;记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  Java 类库的新特性之 Stream类 (注:此文中涉及到的一部分图片为网络图片,若有问题,请联系我将其删除.) 一.Java8对IO/NIO 的改进 Java 8 对 IO/NIO 也做了一些改进,主要包括: 改进了java.nio.charset.Charset 的实现,使编码和解码的效率得以提升: 精简了jre/lib