Java 流(Stream)是 Java 8 引入的一种全新的抽象概念,用于处理集合数据的操作。流提供了一种更简洁、更灵活、更高效的方式来操作集合。以下是一个简单的 Java 流教程,介绍了基本的流概念和用法。

1. 什么是流:

在 Java 中,流是一种用于处理集合数据的高级抽象。它允许你以声明性的方式操作集合,而不是使用传统的迭代方式。流操作可以串行执行,也可以并行执行,这使得它们非常适用于大数据集和并发环境。

2. 流的特点:

  •  不是数据结构: 流不会保存数据,它只是在数据源上执行操作。

  
  •  惰性执行: 流操作不会立即执行,只有在终端操作(如 forEach、collect)调用时才会执行。


  •  可消费性: 流只能被消费一次,消费后就无法再次使用。


3. 流的创建:

可以从集合、数组、I/O 操作等地方创建流。

3.1 从集合创建流:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamCreationExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "orange");

        // 从集合创建流
        Stream<String> streamFromList = list.stream();
    }
}

3.2 从数组创建流:
import java.util.Arrays;
import java.util.stream.IntStream;

public class StreamCreationExample {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};

        // 从数组创建 IntStream
        IntStream streamFromArray = Arrays.stream(array);
    }
}

4. 流的中间操作:

中间操作返回一个新的流,允许你在数据上进行一些转换和过滤。

4.1 过滤:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamIntermediateOperations {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "watermelon");

        // 过滤长度大于 5 的水果
        List<String> filteredFruits = fruits.stream()
                                           .filter(fruit -> fruit.length() > 5)
                                           .collect(Collectors.toList());

        System.out.println(filteredFruits);
    }
}

4.2 映射:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamIntermediateOperations {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "orange");

        // 将水果名转为大写
        List<String> uppercasedFruits = fruits.stream()
                                              .map(String::toUpperCase)
                                              .collect(Collectors.toList());

        System.out.println(uppercasedFruits);
    }
}

5. 流的终端操作:

终端操作触发流的执行,并产生一个最终结果。

5.1 forEach:
import java.util.Arrays;
import java.util.List;

public class StreamTerminalOperations {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "orange");

        // 打印每个水果
        fruits.stream()
              .forEach(System.out::println);
    }
}

5.2 collect:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamTerminalOperations {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "orange");

        // 将水果收集到一个新的列表中
        List<String> collectedFruits = fruits.stream()
                                            .collect(Collectors.toList());

        System.out.println(collectedFruits);
    }
}

6. 并行流:

流支持并行处理,可以提高在多核处理器上的性能。
import java.util.Arrays;
import java.util.List;

public class ParallelStreamExample {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "watermelon");

        // 使用并行流过滤长度大于 5 的水果
        List<String> filteredFruits = fruits.parallelStream()
                                           .filter(fruit -> fruit.length() > 5)
                                           .collect(Collectors.toList());

        System.out.println(filteredFruits);
    }
}

7. 常用操作:

除了上述操作外,流还支持很多其他常用操作,如排序、去重、查找等。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class CommonOperationsExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 2, 4, 6, 8);

        // 去重
        List<Integer> distinctNumbers = numbers.stream()
                                              .distinct()
                                              .collect(Collectors.toList());

        // 排序
        List<Integer> sortedNumbers = numbers.stream()
                                            .sorted()
                                            .collect(Collectors.toList());

        // 查找第一个偶数
        int firstEven = numbers.stream()
                               .filter(num -> num % 2 == 0)
                               .findFirst()
                               .orElse(-1);

        System.out.println(distinctNumbers);
        System.out.println(sortedNumbers);
        System.out.println("First even number: " + firstEven);
    }
}

以上是一个简单的 Java 流教程,介绍了流的基本概念和一些常用操作。流提供了一种更优雅和功能强大的方式来处理集合数据,适用于各种数据处理场景。


转载请注明出处:http://www.pingtaimeng.com/article/detail/463/Java