Stream流

流:就像流水线一样

先得到一条Stream流,并把数据放上去

利用Api进行各种操作

分为中间方法和终结方法

单列集合

        //1.单列集合获取Stream流
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "a", "b", "v");

        //获取到一条流水线,并把集合中的数据放到流水线上
/*        Stream<String> stream1 = list.stream();
        //使用终结方法打印所有数据
*//*        stream1.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });*//*
         */
        list.stream().forEach(s -> System.out.println(s));
        

双列集合

//双列集合,不能直接使用stream

//1.创建双列集合
HashMap<String, Integer> hm = new HashMap<>();
hm.put("a", 1);
hm.put("b", 2);
hm.put("c", 3);
hm.put("d", 4);
hm.put("e", 5);

//2.第一zhong获取stream
hm.keySet().stream().forEach(s -> System.out.println(s));

//3.第二种获取
hm.entrySet().stream().forEach(s -> System.out.println(s));

数组

//数组
//1.创建数组
int[] arr = {1, 2, 3, 4, 5};

//2.获取stream流
Arrays.stream(arr).forEach(s -> System.out.println(s));

零散数据

//一堆零三数据

Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));

中间方法

中间方法,返回新的stream流,原来的stream只能使用一次,建议使用链式编程

修改stream流中的数据,不会影响本身的

过滤

ArrayList<String> list=new ArrayList<>();
Collections.addAll(list,"aaa,","aaaa","bbb","aab");

//filter过滤
list.stream().filter(new Predicate<String>() {
    @Override
    public boolean test(String s) {
        //如果返回值为true,留下
        s.startsWith("a");
        return s.startsWith("a");
    }
}).forEach(s-> System.out.println(s));

//链式编程

list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s ));

获取,跳过

/*
 * limit 获取前几个元素
 * skip  跳过前几个元素
 *
 * */

list.stream().limit(3)
        .forEach(s -> System.out.println(s));

list.stream().skip(4)
        .forEach(s -> System.out.println(s));

去重 合并

/*
 *
 * distinct  元素去重,依赖于哈市Code和equals方法
 *
 * concat       合并a,b为一个流
 *

 * */

ArrayList<String> list1=new ArrayList<>();
Collections.addAll(list1,"aaaa","ab","aaaaaa","bbbbbb","ccccccccc","abccc","aaaa","ab");

ArrayList<String> list2=new ArrayList<>();
Collections.addAll(list2,"bbbb","cccc");

list1.stream().distinct().forEach(s-> System.out.println(s));

Stream.concat(list1.stream(),list2.stream()).forEach(s-> System.out.println(s));

类型转换

/*
 * map   转换流中的数据类型
 * */

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "lbx-18", "zjy-18");

//只获取里面的年龄并打印
//String->int

//方法内部的s表示流里的每一个数据
//return 表示转换以后的数据

list.stream().map(new Function<String, Integer>() {
    @Override
    public Integer apply(String s) {
        String[] split = s.split("-");
        return Integer.parseInt(split[1]);
    }
}).forEach(s-> System.out.println(s));
System.out.println("=======================");
list.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));

终结方法

遍历

/*
 * 泛型:流中数据的类型
 * 形参s 以此表示流的每一个数据
 *
 *
 * */
list1.stream().forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});


list1.stream().forEach(s -> System.out.println(s));

统计

//统计
long count = list1.stream().count();
System.out.println(count);

收集

收集到数组

        /*
        * 泛型:是一个具体类型的数组
        * apply中的形参:流中数据的个数,要跟数组的长度保持一致
        * 返回值:具体类型的数组
        * */

        //toArray方法的参数的作用:创建一个指定类型的数组
        //底层:会依次得到流李的每一个元素,并把数据存到数组当中
        //toArray方法的返回值:是一个装着流里面所有数据的数组
/*        String[] arr= list1.stream().toArray(new IntFunction<String[]>() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });
        System.out.println(Arrays.toString(arr));*/

        String[] arr2 = list1.stream().toArray(value -> new String[value]);
        System.out.println(Arrays.toString(arr2));
    }

收集到集合

//收集到map
//收集所有男性
//确认键为姓名,值为年龄

Map<String, Integer> newMap = list.stream()
        .filter(s -> "男".equals(s.split("-")[1]))
        /*
         * toMap:两个参数
         * 参数1:键的生成规则
         * 参数2:值的生成规则
         * 参数一:
         *       Function泛型一:表示流中每一个数据的类型
         *               泛型二:表示Map集合中键的数据类型
         *       方法apply形参:表示流李每一个数据
         *               方法体:生成键的代码
         *
         *
         * 参数二:
         *      Function泛型一:表示流中每一个数据的类型
         *               泛型二:表示Map集合中值的数据类型
         *                   方法apply形参:生成值的代码
         *               方法体:已经生成的值
         *
         * 注意点:键不能重复!!
         * */
        .collect(Collectors.toMap(new Function<String, String>() {
            @Override
            public String apply(String s) {
                return s.split("-")[0];
            }
        }, new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return Integer.parseInt(s.split("-")[2]);
            }
        }));
System.out.println(newMap);
Map<String, Integer> Map = list.stream()
        .filter(s -> "男".equals(s.split("-")[1]))
        .collect(Collectors.toMap(
                s -> s.split("-")[0],
                s -> Integer.parseInt(s.split("-")[2])
        ));
System.out.println(Map);

<think>好的,用户想要找关于Java Stream的练习题和学习资料。首先,我需要回忆一下相关的知识点,并结合提供的引用内容来整理答案。 首先,用户提供的引用中有四个关于Stream的资料,其中提到了练习题、示例代码以及基础教程。比如引用3提到Stream是Java 8的重要特性,允许声明式处理集合,这可能适合作为教程部分的推荐。引用1和引用2给出了具体的练习题,如转换并行、处理绝对值、使用flatMap拆分单词等。引用4则展示了过滤偶数的例子,这些都是很好的练习题素材。 接下来,我需要将这些内容分类整理,可能分为基础概念、练习题推荐和学习资源。同时,用户可能需要教程链接或书籍推荐,但根据引用中没有提供外部链接,可能需要建议官方文档或知名网站。 还要注意用户提到的系统级指令,比如数学公式的格式,但这次问题不涉及数学内容,所以可能不需要处理这部分。另外,生成相关问题的时候,要确保问题与Stream相关,并且基于已有的引用内容。例如,如何优化Stream性能、并行的使用场景、map和filter的区别等。 需要检查是否有遗漏的要点,比如用户可能对Stream的中间操作和终端操作有疑问,或者想了解常见的陷阱。所以在相关问题里可以包括这些方面。 最后,确保回答结构清晰,分点列出,并且每个部分都有对应的引用支持。例如,在练习题部分具体列出每个练习并标注引用来源,这样用户能清楚知道每个例子出自哪里。同时,学习资源部分可以推荐官方文档和书籍,如《Java 8实战》。 总结一下,回答应该包括基础概念、练习题示例、学习资源和相关问题,确保每个部分都有引用支持,并且语言自然畅。</think>### Java Stream学习资源与练习题整理 #### 一、Stream基础概念 Stream是Java 8的核心特性之一,允许以声明性方式处理集合数据,支持函数式编程风格。例如: ```java list.stream().filter(n -> n % 2 == 0).forEach(System.out::println); ``` 这段代码通过`filter`筛选偶数并输出[^4]。Stream的核心操作包括中间操作(如`map`、`filter`)和终端操作(如`forEach`、`collect`)[^3]。 --- #### 二、经典练习题推荐(含代码示例) 1. **取元素绝对值** ```java Stream.of(1, -2, -3, 4, -5) .map(Math::abs) .forEach(System.out::println); // 输出1,2,3,4,5 [^2] ``` 2. **拆分单词并合并** ```java List<String> words = Arrays.asList("Hello World", "Java Stream"); words.stream() .flatMap(word -> Arrays.stream(word.split(" "))) .forEach(System.out::println); // 输出拆分后的单词[^1] ``` 3. **过滤奇数保留偶数** ```java List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); list.stream() .filter(n -> n % 2 == 0) .forEach(System.out::println); // 输出2,4,6,8,10 ``` 4. **并行加速计算** ```java list.parallelStream() // 转换为并行 .filter(...); // 利用多核处理器提升性能[^1] ``` --- #### 三、学习资源推荐 1. **官方文档** Oracle Java 8 Stream官方教程:系统介绍Stream API的设计与使用场景。 2. **书籍《Java 8实战》** 详细讲解Stream、Lambda表达式等特性,含大量代码示例。 3. **综合教程与练习题集** - 的入门教程:涵盖Stream操作分类(中间操作、终端操作)和常见用例。 - 中的练习题:覆盖`map`、`filter`、`flatMap`和并行等核心操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值