> ## Content Index
> Fetch the complete content index at: https://lucent.blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# Stream API代替for循环
- URL: https://lucent.blog/streamapi/
- Published: 2020-06-23T15:31:22.000Z
- Updated: 2026-08-21T00:49:55.000Z
- Author: Lucent
- Tags: java, Stream API

## 什么是Stream API

Java Stream函数式编程接口最初是在Java 8中引入的，并且与lambda一起成为Java开发的里程碑式的功能特性，它极大的方便了开放人员处理集合类数据的效率。Java Stream就是一个数据流经的管道，并且在管道中对数据进行操作，然后流入下一个管道。有学过linux 管道应该会很容易理解。在没有Java Stram之前，对于集合类的操作，更多的是通过for循环。而Java Stream相对于for 循环更加简洁、易用、快捷。  
管道的功能包括：Filter（过滤）、Map(映射)、sort(排序）等，集合数据通过Java Stream管道处理之后，转化为另一组集合或数据输出。

## Stream API代替for循环

例：  
查找集合中所有名字以字母“L”开头的，将其转换成大写，最后输出：

### 传统写法

```
List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");
List<String> list=new ArrayList<>();
        for (String name:nameStrs) {
            if (name.startsWith("L")){
                list.add(name.toUpperCase());
            }
        }
        Collections.sort(list);
        System.out.println(list);

```

输出结果：

```
[LEMUR, LION]

```

### Stream API写法

```
List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");
List<String> list = nameStrs.stream()
                .filter(s -> s.startsWith("L"))
                .map(String::toUpperCase)
                .sorted()
                .collect(toList());
System.out.println(list);

```

- 首先，我们使用Stream()函数，将一个List转换为管道流
- 调用filter函数过滤数组元素，过滤方法使用lambda表达式，以L开头的元素返回true被保留，其他的List元素被过滤掉
- 然后调用Map函数对管道流中每个元素进行处理，字母全部转换为大写
- 然后调用sort函数，对管道流中数据进行排序
- 最后调用collect函数toList，将管道流转换为List返回

输出结果：

```
[LEMUR, LION]

```

## 将数组转换为管道流

使用Stream.of()方法，将数组转换为管道流。

```
String[] array = {"Monkey", "Lion", "Giraffe", "Lemur"};
Stream<String> name1 = Stream.of(array);
Stream<String> name2 = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");

```

## 将集合类对象转换为管道流

通过调用集合类的stream()方法，将集合类对象转换为管道流。

```
List<String> list = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");
Stream<String> streamFromList = list.stream();

Set<String> set = new HashSet<>(list);
Stream<String> streamFromSet = set.stream();

```

## 将文本文件转换为管道流

通过Files.lines方法将文本文件转换为管道流，下面的Paths.get()方法作用就是获取文件，是Java NIO的API！  
也就是说：我们可以很方便的使用Java Stream加载文本文件，然后逐行的对文件内容进行处理。

```
Stream<String> lines = Files.lines(Paths.get("test.txt"));

```