JDK8新特性:Stream

JDK8最大的改变:

  1. lambda表达式

  2. Stream

1. Steam流的入门

什么是Stream?

也叫Stream流,是jdk8开始的一套API,用于操作集合或者数组中的数据

优点:

Stream流大量结合了Lambda的语法风格来创建,提供了一种更加强大、更加简单的操作集合或者数组中的数据,代码更简洁,可读性更好

java 复制代码
package org.example;

import java.util.*;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        Collections.addAll(names, "张三丰", "张无忌", "王五", "李四", "张三");
        System.out.println(names);
        System.out.println("--------------------------------");

        // 需求: 将姓张的, 并且名字是3个字的人名放到一个新集合

        /*
            1. 集合和数组的API方法
         */
        List<String> list = new ArrayList<>();
        for (String name: names) {
            if (name.length() == 3 && name.startsWith("张")) {
                list.add(name);
            }
        }
        System.out.println(list);
        System.out.println("--------------------------------");
        /*
            2. 使用Steam流
         */
        List<String> list2 = names.stream().filter(s->s.startsWith("张")).filter(a->a.length() == 3).collect(Collectors.toList());
        System.out.println(list2);
    }
}

掌握Stream流就是掌握Stream流的创建、中间方法、终结方法

2. Stream流的创建

java 复制代码
package org.example;

import java.util.*;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        /*
            1. List 获取 stream流
         */
        List<String> names = new ArrayList<>();
        Collections.addAll(names, "张三丰", "张无忌", "王五", "李四", "张三");
        Stream<String> stream = names.stream();
        stream.filter(s->s.contains("三")).forEach(System.out::println);
        System.out.println("--------------------------------");

        /*
            2. Set 获取stream流
         */
        Set<String> set = new HashSet<>();
        set.addAll(names);
        System.out.println(set);
        System.out.println("--------------------------------");
        Stream<String> stream1 = set.stream();
        stream1.filter(s->s.contains("三")).forEach(System.out::println);
        System.out.println("--------------------------------");

        /*
            3. Map 获取stream流
         */
        Map<String, Integer> map = new HashMap<>();
        map.put("张三丰", 1);
        map.put("张无忌", 2);
        map.put("王五", 3);
        map.put("李四", 4);
        map.put("张三", 5);
        Set<String> keys = map.keySet();
        Stream<String> stream2 = keys.stream();

        Collection<Integer> values = map.values();
        Stream<Integer> stream3 = values.stream();

        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        Stream<Map.Entry<String, Integer>> kvs = entries.stream();
        kvs.filter(e -> e.getKey().contains("三")).forEach(e -> {
            System.out.println(e.getKey() + ' ' + e.getValue());
        });

        /*
            4. 获取数组的stream流
         */
        String[] arr = {"1", "2", "3"};
        Stream<String> stream4 = Arrays.stream(arr);
        Stream<String> stream5 = Stream.of(arr);
    }
}

3. Stream流的中间方法

4. Stream流的终结方法

收集Stream流(只能收集一次):

java 复制代码
package org.example;

import java.util.*;

import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("张三丰", 1);
        map.put("张无忌", 2);
        map.put("王五", 3);
        map.put("李四", 4);
        map.put("张三", 5);

        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        Stream<Map.Entry<String, Integer>> kvs = entries.stream();
        Stream<Map.Entry<String, Integer>> kvs1 = entries.stream();

        Map<String, Integer> map1 =  kvs.collect(Collectors.toMap(e -> e.getKey() + "t", e -> e.getValue() * 10));
        System.out.println(map1);
        /*
            {王五t=30, 张三丰t=10, 张三t=50, 李四t=40, 张无忌t=20}
         */


//        Object[] arr = kvs1.toArray();
        Map.Entry<String, Integer>[] arr = kvs1.toArray(len -> new Map.Entry[len]);
        System.out.println(Arrays.toString(arr));

        /*
            [李四=4, 张三=5, 王五=3, 张三丰=1, 张无忌=2]
         */
    }
}

最后:

相关推荐
abcnull43 分钟前
用javaparser做精准测试
java·ast·静态代码分析·精准测试·javaparser
叶小鸡1 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan1 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_180079054731 小时前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路2 小时前
C++23概述
java·c++·c++23
专注API从业者3 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠3 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY3 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克34 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信