当前位置:实例文章 » JAVA Web实例» [文章]java8里如何使用流收集数据?《Java8 实战》读书笔记 第 6 章 用流收集数据

java8里如何使用流收集数据?《Java8 实战》读书笔记 第 6 章 用流收集数据

发布人:shili8 发布时间:2025-02-23 22:31 阅读次数:0

**Java8 流收集数据**

在 Java8 中,流(Stream)是一个非常强大的工具,可以帮助我们处理集合中的元素。流可以用来过滤、映射、聚合等操作,而这些操作都是惰性的,这意味着只有当我们真正需要结果时才会执行这些操作。

**流收集数据**

在本章,我们将学习如何使用流收集数据。收集数据是指从流中提取元素并存储到一个集合中,如 List、Set 等。

###6.1 使用 `collect()` 方法`collect()` 方法是最常用的方法来收集流中的元素。它接受一个 Collector 接口的实现作为参数,这个接口定义了如何将流中的元素收集起来。

**示例代码**

javaimport java.util.List;
import java.util.stream.Collectors;

public class CollectExample {
 public static void main(String[] args) {
 // 创建一个列表 List list = List.of("a", "b", "c", "d");

 // 使用 collect() 方法收集流中的元素 String result = list.stream()
 .collect(Collectors.joining());

 System.out.println(result); // 输出: abcd }
}

在这个示例中,我们使用 `collect()` 方法将流中的元素收集起来,并使用 `Collectors.joining()` 来连接这些元素,得到一个字符串。

###6.2 使用 `toCollection()` 方法`toCollection()` 方法是另一种可以用来收集流中的元素的方法。它接受一个 Collection 接口的实现作为参数,这个接口定义了如何将流中的元素收集起来。

**示例代码**
javaimport java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ToCollectionExample {
 public static void main(String[] args) {
 // 创建一个列表 List list = List.of("a", "b", "c", "d");

 // 使用 toCollection() 方法收集流中的元素 List result = list.stream()
 .collect(Collectors.toCollection(ArrayList::new));

 System.out.println(result); // 输出: [a, b, c, d]
 }
}

在这个示例中,我们使用 `toCollection()` 方法将流中的元素收集起来,并使用 `Collectors.toCollection(ArrayList::new)` 来创建一个 ArrayList。

###6.3 使用 `groupingBy()` 方法`groupingBy()` 方法是另一种可以用来收集流中的元素的方法。它接受一个 Function 接口的实现作为参数,这个接口定义了如何将流中的元素分组起来。

**示例代码**
javaimport java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingByExample {
 public static void main(String[] args) {
 // 创建一个列表 List list = List.of("a", "b", "c", "d");

 // 使用 groupingBy() 方法收集流中的元素 Map> result = list.stream()
 .collect(Collectors.groupingBy(s -> s.charAt(0)));

 System.out.println(result); // 输出: {a=[a], b=[b], c=[c], d=[d]}
 }
}

在这个示例中,我们使用 `groupingBy()` 方法将流中的元素收集起来,并使用 `Collectors.groupingBy(s -> s.charAt(0))` 来分组这些元素,得到一个 Map。

###6.4 使用 `partitioningBy()` 方法`partitioningBy()` 方法是另一种可以用来收集流中的元素的方法。它接受一个 Predicate 接口的实现作为参数,这个接口定义了如何将流中的元素分区起来。

**示例代码**
javaimport java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class PartitioningByExample {
 public static void main(String[] args) {
 // 创建一个列表 List list = List.of("a", "b", "c", "d");

 // 使用 partitioningBy() 方法收集流中的元素 Map> result = list.stream()
 .collect(Collectors.partitioningBy(s -> s.equals("a")));

 System.out.println(result); // 输出: {false=[b, c, d], true=[a]}
 }
}

在这个示例中,我们使用 `partitioningBy()` 方法将流中的元素收集起来,并使用 `Collectors.partitioningBy(s -> s.equals("a"))` 来分区这些元素,得到一个 Map。

###6.5 使用 `summarizingDouble()` 方法`summarizingDouble()` 方法是另一种可以用来收集流中的元素的方法。它接受一个 ToDoubleFunction 接口的实现作为参数,这个接口定义了如何将流中的元素转换为 double 值。

**示例代码**
javaimport java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class SummarizingByExample {
 public static void main(String[] args) {
 // 创建一个列表 List list = List.of(1,2,3,4);

 // 使用 summarizingDouble() 方法收集流中的元素 Map result = list.stream()
 .collect(Collectors.summarizingDouble(i -> (double) i));

 System.out.println(result); // 输出: {count=4.0, sum=10.0}
 }
}

在这个示例中,我们使用 `summarizingDouble()` 方法将流中的元素收集起来,并使用 `Collectors.summarizingDouble(i -> (double) i)` 来转换这些元素为 double 值,得到一个 Map。

###6.6 使用 `averagingInt()` 方法`averagingInt()` 方法是另一种可以用来收集流中的元素的方法。它接受一个ToIntFunction 接口的实现作为参数,这个接口定义了如何将流中的元素转换为 int 值。

**示例代码**
javaimport java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class AveragingByExample {
 public static void main(String[] args) {
 // 创建一个列表 List list = List.of(1,2,3,4);

 // 使用 averagingInt() 方法收集流中的元素 Map result = list.stream()
 .collect(Collectors.averagingInt(i -> i));

 System.out.println(result); // 输出: {average=2}
 }
}

在这个示例中,我们使用 `averagingInt()` 方法将流中的元素收集起来,并使用 `Collectors.averagingInt(i -> i)` 来转换这些元素为 int 值,得到一个 Map。

###6.7 使用 `maxBy()` 方法`maxBy()` 方法是另一种可以用来收集流中的元素的方法。它接受一个 ToIntFunction 接口的实现作为参数,这个接口定义了如何将流中的元素转换为 int 值。

**示例代码**
javaimport java.util.List;
import java.util.OptionalInt;
import java.util.stream.Collectors;

public class MaxByExample {
 public static void main(String[] args) {
 // 创建一个列表 List list = List.of(1,2,3,4);

 // 使用 maxBy() 方法收集流中的元素 OptionalInt result = list.stream()
 .collect(Collectors.maxBy(Integer::compare));

 System.out.println(result); // 输出:4 }
}

在这个示例中,我们使用 `maxBy()` 方法将流中的元素收集起来,并使用 `Collectors.maxBy(Integer::compare)` 来转换这些元素为 int 值,得到一个 OptionalInt。

###6.8 使用 `minBy()` 方法`minBy()` 方法是另一种可以用来收集流中的元素的方法。它接受一个 ToIntFunction 接口的实现作为参数,这个接口定义了如何将流中的元素转换为 int 值。

**示例代码**
javaimport java.util.List;
import java.util.OptionalInt;
import java.util.stream.Collectors;

public class MinByExample {
 public static void main(String[] args) {
 // 创建一个列表 List list = List.of(1,2,3,4);

 // 使用 minBy() 方法收集流中的元素 OptionalInt result = list.stream()
 .collect(Collectors.minBy(Integer::compare));

 System.out.println(result); // 输出:1 }
}

在这个示例中,我们使用 `minBy()` 方法将流中的元素收集起来,并使用 `Collectors.minBy(Integer::compare)` 来转换这些元素为 int 值,得到一个 OptionalInt。

###6.9 使用 `counting()` 方法`counting()` 方法是另一种可以用来收集流中的元素的方法。它接受一个 ToIntFunction 接口的实现作为参数,这个接口定义了如何将流中的元素转换为 int 值。

**示例代码**
javaimport java.util.List;
import java.util.OptionalInt;
import java.util.stream.Collectors;

public class

相关标签:java
其他信息

其他资源

Top