您好,登录后才能下订单哦!
Java 8引入了许多强大的新特性,其中流(Stream)API是最为重要的之一。Stream API提供了一种高效且易于使用的方式来处理集合数据。通过Stream API,我们可以轻松地实现List转Map、分组、过滤等操作。本文将详细介绍如何使用Java 8的Stream API来实现这些常见的集合操作。
在Java 8之前,将List转换为Map通常需要手动遍历List并逐个将元素放入Map中。而在Java 8中,我们可以使用Collectors.toMap
方法轻松实现这一操作。
假设我们有一个Person
类,包含id
和name
两个属性:
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}
如果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
作为合并函数,表示当遇到重复键时,保留旧值。
默认情况下,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将保持插入顺序。
在Java 8中,我们可以使用Collectors.groupingBy
方法对List进行分组操作。分组操作通常用于将List中的元素按照某个属性进行分类。
假设我们有一个Person
类,包含id
、name
和age
三个属性:
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}]}
我们还可以进行多级分组。例如,我们可以先按照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}]}}
我们还可以在分组后进行统计操作。例如,我们可以统计每个年龄组的人数:
Map<Integer, Long> personCountByAge = personList.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
System.out.println(personCountByAge);
输出结果为:
{20=2, 25=2}
在Java 8中,我们可以使用Stream.filter
方法对List进行过滤操作。过滤操作通常用于从List中筛选出符合条件的元素。
假设我们有一个Person
类,包含id
、name
和age
三个属性:
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}]
我们可以使用多个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}]
我们还可以在过滤后进行统计操作。例如,我们可以统计年龄大于20的人数:
long count = personList.stream()
.filter(person -> person.getAge() > 20)
.count();
System.out.println(count);
输出结果为:
2
除了上述的List转Map、分组和过滤操作外,Java 8的Stream API还提供了许多其他常见的集合操作,如排序、去重、映射等。
我们可以使用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}]
我们可以使用Stream.distinct
方法对List进行去重操作。例如,我们可以去除List<Person>
中重复的元素:
List<Person> distinctList = personList.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(distinctList);
我们可以使用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]
Java 8的Stream API为我们提供了一种高效且易于使用的方式来处理集合数据。通过Stream API,我们可以轻松地实现List转Map、分组、过滤等操作。本文详细介绍了如何使用Java 8的Stream API来实现这些常见的集合操作,并提供了相应的代码示例。希望本文能够帮助您更好地理解和使用Java 8的Stream API。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。