stream流以及Lamaba表达式使用方法以及参数说明!!一站式全解!!!!

Stream流

stream 流中的方法通常可以分为中间操作和终止操作两种类型。

中间操作:这些方法可以在流中传递操作,并返回一个新的流作为结果,而不会实际执行任何操作。其中一些常见的中间操作包括:

  • filter(Predicate predicate):筛选出满足指定条件的元素。
  • map(Function mapper):将元素通过指定方法进行映射成新的元素。
  • distinct():去重,返回没有重复元素的流。
  • sorted():排序,按照默认或指定顺序对元素进行排序。
  • limit(long maxSize):限制元素数量不超过指定的值。
  • skip(long n):跳过前 n 个元素。
  • peek(Consumer  T) 它允许以函数式的方式查看流中的每个元素,但与其他中间操作不同,它不会改变流的内容或结构。

这些方法都返回一个新的流对象,因此可以进行链式调用。

示例:

当使用 stream 流时,中间操作是在流中传递操作,并返回一个新的流作为结果,而不会实际执行任何操作。以下是一些常见的中间操作及其参数和用法:

filter(Predicate predicate):筛选出满足指定条件的元素。它接受一个 Predicate 接口参数,其中 T 是流中元素的类型。例如:

stream.filter(s -> s.startsWith("a"))

上述代码将从流中筛选出所有以 “a” 开头的元素。

distinct():去重,返回没有重复元素的流。例如:

stream.distinct()

上述代码将从流中返回没有重复元素的新流。

map(Function mapper):将元素通过指定方法进行映射成新的元素。它接受一个 Function 接口参数,其中 T 是原始元素的类型,而 R 是映射后元素的类型。例如:

stream.map(s -> s.toUpperCase())

上述代码将原始流中的元素都转换为大写字母,并返回一个新的流。

sorted():按照默认或指定顺序对元素进行排序。例如:

stream.sorted()

上述代码将对流中的元素按照默认顺序进行排序。

limit(long maxSize):限制元素数量不超过指定的值。例如:

stream.limit(10)

上述代码将限制流中元素数量不超过 10。

skip(long n):跳过前 n 个元素。例如:

stream.skip(5)

上述代码将跳过流中的前 5 个元素。

在实际使用中,中间操作通常与链式调用一起使用,以对流进行复杂的操作。例如,以下代码基于一些条件对学生对象收集到一个 List 中:

List students = allStudents.stream() .filter(s -> s.getAge() < 18) .map(s -> { Student newStudent = new Student(s.getName(), s.getAge()); return newStudent; }) .sorted((s1, s2) -> s1.getName().compareTo(s2.getName())) .collect(Collectors.toList());

上述代码首先筛选出年龄小于 18 岁的学生,然后将学生对象映射为包含 name 和 age 属性的新对象,接下来按照 name 排序,并将最终结果收集到 List 中。

注意:

        关于map:

        如果要对流中所有元素进行操作的话就不需要return来进行直接对当前元素进行操作就行,如果需要选择性的拿出流中的几个元素的话,就需要使用return来将我拿出的值放入新的流中。

终止操作:这些方法会最终执行流操作并返回最终结果,不再返回新的流对象。其中一些常见的终止操作包括:

  • forEach(Consumer action):对每一个元素执行指定的操作。
  • count():返回流中元素的数量。
  • collect(Collector collector):将流中的元素通过指定的收集器进行收集。
  • reduce(T identity, BinaryOperator accumulator):根据指定的二元操作符将流中的元素归约为一个值。

这些方法都会导致流关闭,因此不能进行链式调用。

forEach(Consumer action):

该方法是一个终止操作,对流中的每个元素执行指定的操作。其参数是一个 Consumer 类型的函数式接口,表示一个需要执行的操作。例如,如果您想对列表中的每个字符串进行打印操作,您可以使用以下代码:

List list = Arrays.asList("apple", "banana", "orange");
list.stream().forEach(s -> System.out.println(s));

count() 

该方法返回流中元素的数量。它是一个终止操作,因为当流被处理时,它会从所有元素中计算总数并返回结果。这个方法不需要任何参数,只需要像这样使用它即可:

List list = Arrays.asList("apple", "banana", "orange");
long count = list.stream().count();

 collect(Collector collector)

该方法是一个终止操作,用于将流中的元素通过指定的收集器进行收集。在 Java 中,收集器是一个实现 java.util.stream.Collector 接口的对象,它用于将流元素本身或它们的某些属性转换成一个集合或其他数据类型。例如,如果您要将字符串列表中的所有元素转换成大写字符串并集中到另一个列表中,您可以使用以下代码:

List list = Arrays.asList("apple", "banana", "orange");
List newList = list.stream()
  .map(String::toUpperCase)
  .collect(Collectors.toList());

 在这个例子中,我们首先调用“stream”方法将字符串列表转换成流。然后使用“map”方法将每个字符串元素转换成大写形式。最后,使用“collect”方法将所有字符串添加到新列表中并返回结果。

reduce(T identity, BinaryOperator accumulator):

该方法利用给定的二元运算将流中的元素归约为单个值。它包含两个参数:identity 和 accumulator。identity 是初始值,用于指定归约的初始状态。accumulator 是一个 BinaryOperator 类型的函数式接口,用于执行两个相邻的元素之间的归约操作。例如,如果您想对数字列表中的元素求和,您可以使用以下代码:

List list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, (a, b) -> a + b);

 在这个例子中,我们调用“reduce”方法,将初始值“0”作为第一个参数,而将 lambda 表达式“(a, b) -> a + b”作为第二个参数。这个 lambda 表达式将两个相邻的数字相加,每个数字依次作为参数。因此,从第一个到最后一个数字,它们被累加并返回结果。

当使用 stream 流时,除了中间操作和终止操作之外,还有一些其他的操作可供使用。以下是一些常见的其他操作:

toArray():将流中的元素转换为一个数组并返回。例如:

String[] array = stream.toArray(String[]::new);

findFirst():查找流中的第一个元素,并返回一个 Optional 对象,该对象可能包含元素或为空。例如:

Optional result = stream.findFirst();

anyMatch()、allMatch() 和 noneMatch():这些方法用于测试流中的元素是否匹配指定的条件。anyMatch() 当流中至少有一个元素匹配时返回 true,allMatch() 当流中所有元素都匹配时返回 true,而 noneMatch() 当流中不存在匹配时返回 true。例如:

boolean anyMatchStartsWithA = stream.anyMatch(s -> s.startsWith("a"));

flatMap():将一个流中的每个元素转换为另一个流,并将这些流合并成一个单一流。例如:

Stream flatMap = stream.flatMap(s -> Stream.of(s.split(",")));

你可能感兴趣的:(java1.8,java,开发语言)