java8新特性–Stream流式编程

对于流式编程, 学过scala和python的同学应该有所了解, 举个例子

1
2
3
4
5
6
7
8
9
10
11
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");

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

是不是十分简洁优雅, 我当时学习scala的时候, 就被这种流式编程所惊艳到, 进而了解到java8也有这种特性, 以后输出数组什么的再也不用for循环了

获取流

  • List Set直接.stream()
  • map.keySet().stream() //先转化为Set再.stream()
  • Collection map2 = map.values(); Stream stream4 = map2.stream();
  • map.entrySet().stream()
  • Stream.of(arr); // 根据数组获取流

常用方法

方法名称 方法作用 方法种类
count 统计个数 终结方法
forEach 逐一处理 终结方法
filter 过滤 函数拼接
limit 取用前几个 函数拼接
skip 跳过前几个 函数拼接
map 映射 函数拼接
concat 组合 函数拼接
  • forEach 将每一个流元素交给相应的函数进行处理

  • filter 将一个流转换成另一个子集流

  • map 将流中的元素映射到另一个流中

    1
    2
    3
    List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
    // 获取对应的平方数
    numbers.stream().map(i -> i * i).forEach(System.out::println);
  • concat 将两个流合并为一个流

    Stream<String> result = Stream.concat(streamA, streamB);

collect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<String> list2 = new ArrayList<>();
list2.add("张老三");
list2.add("张小三");
list2.add("李四");
list2.add("赵五");
list2.add("张六");
list2.add("王八");

// 需求:过滤出姓张的并且长度为3的元素
Stream<String> stream = list2.stream().filter((String name) -> {
return name.startsWith("张");
}).filter((String name) -> {
return name.length() == 3;
});

// stream 收集到单列集合中
stream.collect(Collectors.toList()).forEach(System.out::println);