List<Author> authors = getAuthors();
Stream<Author> stream = authors.stream();
在 Java 中,stream()
是集合类(如 List
、Set
、Map
等)提供的一个方法,用于获取一个流(Stream)。通过流,你可以使用更灵活的函数式编程方式对集合进行各种操作。
下面是一个简单的示例,演示了如何使用 stream()
方法:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
// 创建一个列表
List<String> words = Arrays.asList("hello", "world", "java", "stream");
// 使用 stream() 方法获取流
List<String> upperCaseWords = words.stream()
.map(String::toUpperCase) // 将每个元素转为大写
.collect(Collectors.toList()); // 将结果收集为列表
System.out.println("Original List: " + words);
System.out.println("Modified List: " + upperCaseWords);
}
}
在这个例子中,我们首先创建了一个包含字符串的列表 words
,然后通过 stream()
方法获取了一个流。接着,我们使用 map
操作将每个字符串转为大写形式,最后使用 collect
操作将结果收集为一个新的列表。
使用流的好处之一是可以通过链式操作轻松组合多个中间和终端操作,以实现对数据的处理。流提供了一种更函数式的编程风格,使得代码更简洁、可读性更好。
Integer[] arr = {1,2,3,4,5};
Stream<Integer> stream = Arrays.stream(arr);
Stream<Integer> stream2 = Stream.of(arr);
在 Java 中,你可以使用 Arrays.stream(数组)
或 Stream.of(数组)
来将数组转换为流(Stream)。这样可以方便地使用流的各种操作对数组进行处理。
下面是使用这两种方法的示例:
import java.util.Arrays;
import java.util.stream.Stream;
public class ArrayToStreamExample {
public static void main(String[] args) {
// 使用 Arrays.stream() 将数组转换为流
int[] intArray = {1, 2, 3, 4, 5};
Arrays.stream(intArray)
.forEach(System.out::println);
// 使用 Stream.of() 将数组转换为流
String[] stringArray = {"apple", "banana", "orange"};
Stream.of(stringArray)
.forEach(System.out::println);
}
}
在这个例子中,我们首先使用 Arrays.stream(intArray)
将整型数组转换为流,然后使用 forEach
输出流中的每个元素。接着,我们使用 Stream.of(stringArray)
将字符串数组转换为流,同样使用 forEach
输出每个元素。
这种将数组转换为流的方式非常灵活,使得我们可以利用流的各种操作来处理数组中的元素,比如映射、过滤、排序等。
Map<String,Integer> map = new HashMap<>();
map.put("蜡笔小新",19);
map.put("黑子",17);
map.put("日向翔阳",16);
Stream<Map.Entry<String, Integer>> stream = map.entrySet().stream();
在 Java 中,如果你有一个双列集合(比如 Map
)并希望将其转换成单列集合,你可以使用 entrySet()
方法获取到Map
中所有的键值对(Entry
对象),然后再对这些键值对进行处理。这可以通过 stream()
方法来实现。
以下是一个简单的示例,演示了如何将 Map
转换为包含所有键的列表:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class MapToListExample {
public static void main(String[] args) {
// 创建一个Map
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
map.put("three", 3);
// 使用entrySet()获取键值对,然后将其转换为流,再进行处理
List<String> keys = map.entrySet().stream()
.map(Map.Entry::getKey)
.collect(Collectors.toList());
System.out.println("Original Map: " + map);
System.out.println("Keys as List: " + keys);
}
}
在这个例子中,entrySet()
方法返回一个包含键值对的Set
,然后通过 stream()
方法将其转换为流。使用 map
操作将每个键值对映射为键(Entry::getKey
),最后通过 collect
操作将结果收集为一个列表。
这样,你就可以从双列集合中提取出其中的某一列,然后以单列集合的形式进行使用。
可以对流中的元素进行条件过滤,符合过滤条件的才能继续留在流中。
List<Author> authors = getAuthors();
authors.stream()
.filter(author -> author.getName().length()>1)
.forEach(author -> System.out.println(author.getName()));
可以把对流中的元素进行计算或转换。
List<Author> authors = getAuthors();
authors
.stream()
.map(author -> author.getName())
.forEach(name->System.out.println(name));
// 打印所有作家的姓名
List<Author> authors = getAuthors();
// authors.stream()
// .map(author -> author.getName())
// .forEach(s -> System.out.println(s));
authors.stream()
.map(author -> author.getAge())
.map(age->age+10)
.forEach(age-> System.out.println(age));
可以去除流中的重复元素。
List<Author> authors = getAuthors();
authors.stream()
.distinct()
.forEach(author -> System.out.println(author.getName()));
注意:distinct方法是依赖Object的equals方法来判断是否是相同对象的。所以需要注意重写equals方法。
可以对流中的元素进行排序。
List<Author> authors = getAuthors();
// 对流中的元素按照年龄进行降序排序,并且要求不能有重复的元素。
authors.stream()
.distinct()
.sorted()
.forEach(author -> System.out.println(author.getAge()));
List<Author> authors = getAuthors();
// 对流中的元素按照年龄进行降序排序,并且要求不能有重复的元素。
authors.stream()
.distinct()
.sorted((o1, o2) -> o2.getAge()-o1.getAge())
.forEach(author -> System.out.println(author.getAge()));
注意:如果调用空参的sorted()方法,需要流中的元素是实现了Comparable。
可以设置流的最大长度,超出的部分将被抛弃。
List<Author> authors = getAuthors();
authors.stream()
.distinct()
.sorted()
.limit(2)
.forEach(author -> System.out.println(author.getName()));
跳过流中的前n个元素,返回剩下的元素
// 打印除了年龄最大的作家外的其他作家,要求不能有重复元素,并且按照年龄降序排序。
List<Author> authors = getAuthors();
authors.stream()
.distinct()
.sorted()
.skip(1)
.forEach(author -> System.out.println(author.getName()));
map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素。
// 打印所有书籍的名字。要求对重复的元素进行去重。
List<Author> authors = getAuthors();
authors.stream()
.flatMap(author -> author.getBooks().stream())
.distinct()
.forEach(book -> System.out.println(book.getName()));
// 打印现有数据的所有分类。要求对分类进行去重。不能出现这种格式:哲学,爱情 爱情
List<Author> authors = getAuthors();
authors.stream()
.flatMap(author -> author.getBooks().stream())
.distinct()
.flatMap(book -> Arrays.stream(book.getCategory().split(",")))
.distinct()
.forEach(category-> System.out.println(category));