Java8怎么快速实现List转map 、分组、过滤等操作

发布时间:2021-07-29 18:48:47 作者:chen
来源:亿速云 阅读:382

Java8怎么快速实现List转map 、分组、过滤等操作

Java 8引入了许多强大的新特性,其中流(Stream)API是最为重要的之一。Stream API提供了一种高效且易于使用的方式来处理集合数据。通过Stream API,我们可以轻松地实现List转Map、分组、过滤等操作。本文将详细介绍如何使用Java 8的Stream API来实现这些常见的集合操作。

1. List转Map

在Java 8之前,将List转换为Map通常需要手动遍历List并逐个将元素放入Map中。而在Java 8中,我们可以使用Collectors.toMap方法轻松实现这一操作。

1.1 基本用法

假设我们有一个Person类,包含idname两个属性:

public class Person {
    private int id;
    private String name;

    // 构造方法、getter和setter省略
}

现在我们有一个List<Person>,我们希望将其转换为一个Map<Integer, String>,其中id作为键,name作为值:

List<Person> personList = Arrays.asList(
    new Person(1, "Alice"),
    new Person(2, "Bob"),
    new Person(3, "Charlie")
);

Map<Integer, String> personMap = personList.stream()
    .collect(Collectors.toMap(Person::getId, Person::getName));

System.out.println(personMap);

输出结果为:

{1=Alice, 2=Bob, 3=Charlie}

1.2 处理重复键

如果List中存在重复的id,那么在转换为Map时会抛出IllegalStateException异常。为了避免这种情况,我们可以提供一个合并函数来处理重复键:

List<Person> personList = Arrays.asList(
    new Person(1, "Alice"),
    new Person(2, "Bob"),
    new Person(2, "Charlie")
);

Map<Integer, String> personMap = personList.stream()
    .collect(Collectors.toMap(Person::getId, Person::getName, (oldValue, newValue) -> oldValue));

System.out.println(personMap);

输出结果为:

{1=Alice, 2=Bob}

在这个例子中,我们使用(oldValue, newValue) -> oldValue作为合并函数,表示当遇到重复键时,保留旧值。

1.3 自定义Map类型

默认情况下,Collectors.toMap会生成一个HashMap。如果我们希望生成其他类型的Map,可以使用Collectors.toMap的重载方法:

Map<Integer, String> personMap = personList.stream()
    .collect(Collectors.toMap(Person::getId, Person::getName, (oldValue, newValue) -> oldValue, LinkedHashMap::new));

System.out.println(personMap);

在这个例子中,我们使用LinkedHashMap::new作为Map的工厂方法,生成的Map将保持插入顺序。

2. 分组操作

在Java 8中,我们可以使用Collectors.groupingBy方法对List进行分组操作。分组操作通常用于将List中的元素按照某个属性进行分类。

2.1 基本分组

假设我们有一个Person类,包含idnameage三个属性:

public class Person {
    private int id;
    private String name;
    private int age;

    // 构造方法、getter和setter省略
}

现在我们有一个List<Person>,我们希望将其按照age进行分组:

List<Person> personList = Arrays.asList(
    new Person(1, "Alice", 20),
    new Person(2, "Bob", 25),
    new Person(3, "Charlie", 20),
    new Person(4, "David", 25)
);

Map<Integer, List<Person>> personMapByAge = personList.stream()
    .collect(Collectors.groupingBy(Person::getAge));

System.out.println(personMapByAge);

输出结果为:

{20=[Person{id=1, name='Alice', age=20}, Person{id=3, name='Charlie', age=20}], 
 25=[Person{id=2, name='Bob', age=25}, Person{id=4, name='David', age=25}]}

2.2 多级分组

我们还可以进行多级分组。例如,我们可以先按照age分组,然后在每个年龄组内再按照name分组:

Map<Integer, Map<String, List<Person>>> personMapByAgeAndName = personList.stream()
    .collect(Collectors.groupingBy(Person::getAge, Collectors.groupingBy(Person::getName)));

System.out.println(personMapByAgeAndName);

输出结果为:

{20={Alice=[Person{id=1, name='Alice', age=20}], Charlie=[Person{id=3, name='Charlie', age=20}]}, 
 25={Bob=[Person{id=2, name='Bob', age=25}], David=[Person{id=4, name='David', age=25}]}}

2.3 分组后统计

我们还可以在分组后进行统计操作。例如,我们可以统计每个年龄组的人数:

Map<Integer, Long> personCountByAge = personList.stream()
    .collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));

System.out.println(personCountByAge);

输出结果为:

{20=2, 25=2}

3. 过滤操作

在Java 8中,我们可以使用Stream.filter方法对List进行过滤操作。过滤操作通常用于从List中筛选出符合条件的元素。

3.1 基本过滤

假设我们有一个Person类,包含idnameage三个属性:

public class Person {
    private int id;
    private String name;
    private int age;

    // 构造方法、getter和setter省略
}

现在我们有一个List<Person>,我们希望筛选出年龄大于20的人:

List<Person> personList = Arrays.asList(
    new Person(1, "Alice", 20),
    new Person(2, "Bob", 25),
    new Person(3, "Charlie", 20),
    new Person(4, "David", 25)
);

List<Person> filteredList = personList.stream()
    .filter(person -> person.getAge() > 20)
    .collect(Collectors.toList());

System.out.println(filteredList);

输出结果为:

[Person{id=2, name='Bob', age=25}, Person{id=4, name='David', age=25}]

3.2 多重过滤

我们可以使用多个filter方法进行多重过滤。例如,我们可以筛选出年龄大于20且名字以”B”开头的人:

List<Person> filteredList = personList.stream()
    .filter(person -> person.getAge() > 20)
    .filter(person -> person.getName().startsWith("B"))
    .collect(Collectors.toList());

System.out.println(filteredList);

输出结果为:

[Person{id=2, name='Bob', age=25}]

3.3 过滤后统计

我们还可以在过滤后进行统计操作。例如,我们可以统计年龄大于20的人数:

long count = personList.stream()
    .filter(person -> person.getAge() > 20)
    .count();

System.out.println(count);

输出结果为:

2

4. 其他常见操作

除了上述的List转Map、分组和过滤操作外,Java 8的Stream API还提供了许多其他常见的集合操作,如排序、去重、映射等。

4.1 排序

我们可以使用Stream.sorted方法对List进行排序。例如,我们可以按照年龄对List<Person>进行排序:

List<Person> sortedList = personList.stream()
    .sorted(Comparator.comparingInt(Person::getAge))
    .collect(Collectors.toList());

System.out.println(sortedList);

输出结果为:

[Person{id=1, name='Alice', age=20}, Person{id=3, name='Charlie', age=20}, 
 Person{id=2, name='Bob', age=25}, Person{id=4, name='David', age=25}]

4.2 去重

我们可以使用Stream.distinct方法对List进行去重操作。例如,我们可以去除List<Person>中重复的元素:

List<Person> distinctList = personList.stream()
    .distinct()
    .collect(Collectors.toList());

System.out.println(distinctList);

4.3 映射

我们可以使用Stream.map方法对List中的元素进行映射操作。例如,我们可以将List<Person>中的name提取出来:

List<String> nameList = personList.stream()
    .map(Person::getName)
    .collect(Collectors.toList());

System.out.println(nameList);

输出结果为:

[Alice, Bob, Charlie, David]

5. 总结

Java 8的Stream API为我们提供了一种高效且易于使用的方式来处理集合数据。通过Stream API,我们可以轻松地实现List转Map、分组、过滤等操作。本文详细介绍了如何使用Java 8的Stream API来实现这些常见的集合操作,并提供了相应的代码示例。希望本文能够帮助您更好地理解和使用Java 8的Stream API。

推荐阅读:
  1. Java中List、Set、Map区别
  2. Java8怎样通过Lambda处理List集合

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Linux服务器编译安装Mono的方法

下一篇:c++ 显示具体化和显示实例化的详细讲解

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》