Java流


在Java 8中,Streams被添加为Java工具箱的新功能。 Streams允许您快速,干净地处理集合。

在继续之前,请阅读有关lambdas和函数式编程的章节。

怎么运行的

Stream为您循环集合的元素。 为每个对象调用每个中间和终端操作。 完成第一个对象的所有操作后,将加载第二个对象。

重要方法

创建

  • Collection.stream() :从任何实现Collection类中的任何对象创建一个Stream
  • Arrays.stream(array) :从Array创建一个Stream

中级操作

这些操作以某种方式转换流对象。

  • Stream.map(Function<In,Out> function) :应用函数将In转换为Out
  • Stream.filter(Predicate<In> predicate) :从Stream中删除对象,谓词不测试为true
  • Stream.distinct() :从Stream中删除重复的对象
  • Stream.sorted() :对Stream中的对象进行排序
  • Stream.limit(int n) :在n个对象之后的end Stream.limit(int n)

终端操作

这些操作接收流对象并结束流。

  • Stream.collect(Collector<In,?,Out> collector) :将Stream中的所有对象收集到Object中
  • Stream.forEach(Consumer<In> consumer) :使用使用者函数使用Stream中的所有对象
  • Stream.count() :计算Stream中的所有对象
  • Stream.findFirst() :返回Stream的第一个Object并停止
  • Stream.anyMatch(Predicate<In> predicate) :如果Stream中的任何Object对Predicate测试为true,则返回true
  • Stream.allMatch(Predicate<In> predicate) :如果Stream中的所有Object对Predicate测试为true,则返回true

例子

// print the length of all Strings in a List
 for (String string : Arrays.asList("abc", "de", "f", "abc")) {
    int length = string.length();
    System.out.println(length);
 }

 Arrays.asList("abc", "de", "f", "abc")
        .stream()
        .map(String::length)
        .forEach(System.out::println);

 // output: 3 2 1 3
// print all Strings in a List with a Length greater than 2
 for (String string : Arrays.asList("abc", "de", "f", "abc")) {
    if (string.length() > 2) {
        System.out.println(string);
    }
 }

 Arrays.asList("abc", "de", "f", "abc")
        .stream()
        .filter(string -> string.length() > 2)
        .forEach(System.out::println);

 // output: abc abc
// create a sorted List with all unique Strings from another List which are longer than or requal 2
 List<String> result = new ArrayList<>();
 for (String string : Arrays.asList("de", "abc", "f", "abc")) {
    if (string.length() >= 2
            && ! result.contains(string)) {
        result.add(string);
    }
 }
 Collections.sort(result);

 List<String> result2 = Arrays.asList("de", "abc", "f", "abc")
        .stream()
        .filter(string -> string.length() >= 2)
        .distinct()
        .sorted()
        .collect(Collectors.toList());

 // result: abc de

更多Java教程

学习更多Java教程