hooyantsing's Blog

Java8 Stream流式编程爱 撸码就是快 流式编程好 代码传家宝

字数统计: 513阅读时长: 2 min
2022/05/13

视频源:java8 Stream流式编程爱 撸码就是快,流式编程好 代码传家宝

函数式接口

接口内仅有一个声明的方法。

@FunctionalInterface

该注解用于声明该接口为函数式接口,并无什么作用,顶多当接口内存在两个及以上方法时该注解无法通过编译。

1
2
3
4
@FunctionalInterface
public interface demo {
void method;
}

方法引用

1
2
3
4
5
6
7
8
9
10
run(SimpleLamdba::doFormatStatic); // 静态方法引用
run(new SimpleLamdba()::doFormat); // 普通方法引用

public static String doFormatStatic(String param) {
return "name" + param;
}

public String doFormat(String param) {
return "name" + param;
}

Stream 执行机制解密

  • Stream 不存储数据,不用担心内存溢出;
  • Stream 不改变源数据;
  • Stream 不可重复使用。

image-20220513094612366

  • “过滤” 和 “排序” 可以拥有多个,“采集” 只能拥有一个。
  • “过滤” 和 “排序” 是懒节点,只有当执行 “采集” 节点时,前面的节点才执行,否则将即便是写了 “过滤” 和 “排序” 代码也不执行。

创建流

用例:

1
2
3
4
5
6
7
private static final List<Apple> appleStore = Arrays.asList(
new Apple(1, "red", 500, "湖南"),
new Apple(2, "red", 100, "天津"),
new Apple(3, "green", 300, "湖南"),
new Apple(4, "green", 200, "天津"),
new Apple(5, "green", 100, "湖南")
);

向 Stream 转换方法:

1
2
3
4
5
6
7
// list -> stream
// Method 01:
appleStore.stream();
// Method 02:
Arrays.stream(new int[]{1,2,3});
// Method 03:
Stream.of(1,2,3);

1. 流的生成与不可重复使用

1
2
3
4
5
Stream<Apple> stream1 = appleStore.stream();
Stream<Apple> stream2 = stream1.filter(a -> a.getColor().equals("red"));
Stream<Apple> stream3 = stream1.filter(a -> a.getWeight() > 100);

// 执行结果报错

stream2 流使用了 stream1 流,stream1 流销毁,当 stream3 流使用 stream1 流时执行报错。

上一个节点可以影响下一个节点
1
2
3
4
5
6
appleStore.stream()
.fillter(a -> a.getColor().equals("red") || a.getColor().equals("green")) // 过滤
.map(a -> a.getColor()) // 将 Apple 对象转换为 String 字符串
.distinct() // 去重
.peek(color -> System.out.println(color)) // 打印
.toArray();
Debug 方法

详见视频进度: 1:02:00

采集
  1. list
  2. map
  3. group by
  4. 数组
  5. 最大值
  6. 求任意值
CATALOG
  1. 1. 函数式接口
    1. 1.1. @FunctionalInterface
    2. 1.2. 方法引用
  2. 2. Stream 执行机制解密
    1. 2.1. 创建流
    2. 2.2. 1. 流的生成与不可重复使用
      1. 2.2.1. 上一个节点可以影响下一个节点
      2. 2.2.2. Debug 方法
      3. 2.2.3. 采集