32Java 8 Stream

什么是Stream

  • —个“流”
  • 不易出错
  • 简化代码
  • 可读性/可维护性++

Stream 的API-创建 Stream

  • Collection,stream()
  • Stream.of
  • String,chars()
  • IntSteam.range()

Stream的API-中间操作

  • 仍然返回Stream的操作
  • filter
  • map
  • sorted

Stream的API-终结操作

  • 返回非'Stream'的操作,包括void
  • 一个流只能被消费一次
  • forEach
  • count/max/min
  • findFirst/findAny
  • anyMatch/noneMatch
  • —collect

collector与Collectors

  • collect操作是最强大的操作
  • toSet/toList/toCollection
  • joining。
  • toMap()
  • groupingBy()

并发流

  • parallelStream()
  • 可以通过并发提高互相独立的操作的性能
  • 在正确使用的前提下,可以获得近似线性的性能提升
  • 但是!使用要小心,性能要测试,如果你不知道自己在做什 么,就忘了它吧。
    // 使用流的方法,把所有长度等于1的单词挑出来,然后用逗号连接起来
    // 例如,传入参数words=['a','bb','ccc','d','e']
    // 返回字符串a,d,e
    public static String filterThenConcat(Set<String> words) {
        return words.stream()
                .filter(word -> word.length() == 1)
                .collect(Collectors.joining(","));
    }

参考文献 Effective Java

第七章 Item 42-48

创建流:

  • 所有的 Collection 集合都可以通过 stream 默认方法获取流;
  • Stream 接口的静态方法 of 可以获取数组对应的流。
  1. 根据Collection获取流

    public static void main(String[] args) {
           List list = new ArrayList<>();
    
           Stream stream1 = list.stream();
    
           Set set = new HashSet<>();
    
           Stream stream2 = set.stream();
    
           Vector vector = new Vector<>();
    
           Stream stream3 = vector.stream();
       }
  2. 根据Map获取流

    Map不是Collection的子接口,K-V不符合流元素单一特性

    public static void main(String[] args) {
           List list = new ArrayList<>();
    
           Stream stream1 = list.stream();
    
           Set set = new HashSet<>();
    
           Stream stream2 = set.stream();
    
           Vector vector = new Vector<>();
    
           Stream stream3 = vector.stream();
       }
  3. 根据数组获取流

    public static void main(String[] args) {
           String[] array = { "张无忌", "张翠山", "张三丰", "张一元" };
           Stream stream = Stream.of(array);
       }
  4. String.chars()

    // 使用流的方法,再把之前的题目做一遍吧
    // 统计一个给定的字符串中,大写英文字母(A,B,C,...,Z)出现的次数。
    // 例如,给定字符串"AaBbCc1234ABC",返回6,因为该字符串中出现了6次大写英文字母ABCABC
    public static int countUpperCaseLetters(String str) {
       return (int) str.chars().filter(Character::isUpperCase).count();
    }
方法名 方法作用 方法种类 是否支持链式调用
count 统计个数 终结
forEach 逐一处理 终结
filter 过滤 函数拼接
limit 取用前几个 函数拼接
skip 跳过前几个 函数拼接
map 映射 函数拼接
concat 组合 函数拼接

收集到集合中

Stream流提供 collect 方法,其参数需要一个 java.util.stream.Collector<T,A, R> 接口对象来指定收集到哪种
集合中。 java.util.stream.Collectors 类提供一些方法,可以作为 Collector 接口的实例:

public static Collector<T, ?, List> toList() :转换为 List 集合。
public static Collector<T, ?, Set> toSet() :转换为 Set 集合。

练习

32Java 8 Stream

    // 编写一个方法,筛选出年龄大于等于60的用户,然后将他们按照年龄从大到小排序,将他们的名字放在一个LinkedList中返回
    public static LinkedList<String> collectNames(List<User> users) {
        return users.stream()
                .filter(user -> user.age >= 60)
                .sorted(Comparator.comparing(User::getAge).reversed())
                .map(User::getName).collect(Collectors.toCollection(LinkedList::new));
    }

「资料来源:饥人谷」

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注