【Java8 Stream】Stream 使用基础

53 阅读2分钟

黑马开源 Java 基础教程笔记,如有侵权内容请联系本人删除,感谢。

Stream 流的思想

  • 可以理解为工厂的流水线
  • 结合 lambda 表达式,简化集合、数组操作
  • 使用步骤为:
  1. 得到 stream 流
  2. 利用 stream 流中各类 api 操作
  • 中间方法
  • 终结方法

获取 stream 流

image.png

public void testStream(){
    // 单列集合
    List<String> a = new ArrayList<>();
    a.add("a");
    a.add("b");
    a.add("c");
    a.add("d");
    a.add("e");
    Collections.addAll(a, "hh", "bb");
    // 获取流水线
    Stream<String> single_column_stream = a.stream();
    // 使用终结方法打印流水线上数据
    single_column_stream.forEach(s -> System.out.println(s));
    // 双列集合
    Map<String, String> map = new HashMap<>();
    map.put("a", "b");
    map.put("c", "d");
    map.put("d", "e");
    map.keySet().stream().forEach(s -> System.out.println(map.get(s)));
    map.entrySet().stream().forEach(e -> System.out.println(e));
    // 数组类型
    int[] arr = {1, 2, 3, 4, 5};
    Arrays.stream(arr).forEach(s -> System.out.print(s + " "));
    // 零散数据
    Stream.of(1,2,3,4,5).forEach(s -> System.out.print(s + " "));
}

注意:Stream.of() 的形参不能是基本数据类型数组

// 注意
// 下面输出:[I@5b2133b1 
Stream.of(arr).forEach(s -> System.out.print(s + " "));

Stream 的中间方法

image.png

filter

List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "张良", "孙悟空", "张飞");
// 过滤,留下 张 开头数据
names.stream().filter(s -> {
    // 返回 true 流
    if (s.startsWith("张")) {
        return true;
    }
    return false;
}).forEach(s -> System.out.println(s));

注意:原来的 stream 流只能使用一次,链式编程 —— 一行解决 (代码可读性变差 —— 多换行解决)

List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "张良", "孙悟空", "张飞");
// 过滤,留下 张 开头数据
names.stream().filter(s -> {
    // 返回 true 流
    if (s.startsWith("张")) {
        return true;
    }
    return false;
}).filter(s -> {
    if (s.length() == 2) {
        return true;
    }
    return false;
}).forEach(s -> System.out.println(s));

limit 限制

names.stream().limit(2).forEach(s -> System.out.println(s));

skip 跳过

names.stream().skip(2).forEach(s -> System.out.println(s));

distinct 去重

依赖 hashcode 和 equals 方法

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

concat 合并

Stream.concat(names2.stream(), names.stream()).forEach(s -> System.out.println(s));

map 类型转换

ages.stream().map(s -> Integer.parseInt(s)).forEach(s -> System.out.println(s));

终结方法

没有返回值,流的最后操作

image.png

forEach

ages.stream().map(s -> Integer.parseInt(s)).forEach(s -> System.out.println(s));

count

统计流中数据

long count = ages.stream().map(s -> Integer.parseInt(s)).count();

toArray

收集流中数据到数组

Integer[] agesArray = ages.stream()
        .map(s -> Integer.parseInt(s))
        .toArray(value -> new Integer[value]);

收集方法 collect

// 收集到 list 集合
List<String> new_list = ages.stream().filter(s -> Integer.parseInt(s) >= 20).collect(Collectors.toList());
// 收集到 set 集合
Set<String> new_set = ages.stream().filter(s -> Integer.parseInt(s) >= 20).collect(Collectors.toSet());
// 收集到 map 集合
List<String> persons = new ArrayList<>();
Collections.addAll(persons, "张无忌-18", "张良-32", "孙悟空-100001", "张飞-28");
// map 集合有两个参数
// new Function<String, String>()
// 第一个为 流的数据类型
// 第二个为 map中键/值的数据类型
// **注意:键不能重复,代码会报错
Map<String, Integer> collect = persons
        .stream()
        .filter(s -> Integer.parseInt(s.split("-")[1]) >= 20)
        .collect(Collectors.toMap(s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[1]))
);