String的list 用Collectors.groupingBy(
时间: 2023-11-14 17:08:50 浏览: 65
Collectors.groupingBy() 方法可以将一个 Stream 中的元素按照指定的条件分组,返回一个 Map 对象,其中键为分组条件,值为分组后的元素列表。如果要将 String 类型的元素按照长度分组,可以这样写:
```
List<String> list = Arrays.asList("apple", "banana", "orange", "pear", "grape");
Map<Integer, List<String>> map = list.stream().collect(Collectors.groupingBy(String::length));
```
这样就会得到一个 Map 对象,其中键为字符串长度,值为该长度的字符串列表。
相关问题
Collectors.groupingBy配合Collectors.collectingAndThen()的使用
`Collectors.groupingBy()`方法可以将流中的元素按照指定的条件分组,返回一个`Map`对象,其中键为分组条件,值为分组后的元素列表。而`Collectors.collectingAndThen()`方法可以对分组后的结果进行进一步的处理,例如对分组后的元素列表进行求和、求平均值等操作。
下面是一个示例代码,演示了如何使用`Collectors.groupingBy()`方法和`Collectors.collectingAndThen()`方法对一个`List`中的元素进行分组,并计算每个分组的平均值:
```java
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", "IT", new BigDecimal("5000")),
new Employee("Bob", "IT", new BigDecimal("6000")),
new Employee("Charlie", "HR", new BigDecimal("7000")),
new Employee("David", "HR", new BigDecimal("8000"))
);
Map<String, Double> avgSalaryByDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDept,
Collectors.collectingAndThen(
Collectors.averagingDouble(e -> e.getSalary().doubleValue()),
avg -> BigDecimal.valueOf(avg).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()
)
));
System.out.println(avgSalaryByDept);
}
}
class Employee {
private String name;
private String dept;
private BigDecimal salary;
public Employee(String name, String dept, BigDecimal salary) {
this.name = name;
this.dept = dept;
this.salary = salary;
}
public String getName() {
return name;
}
public String getDept() {
return dept;
}
public BigDecimal getSalary() {
return salary;
}
}
```
输出结果为:
```
{HR=7500.0, IT=5500.0}
```
上述代码中,首先定义了一个`Employee`类,其中包含了员工的姓名、部门和薪水信息。然后创建了一个包含了4个`Employee`对象的`List`。接着使用`Collectors.groupingBy()`方法对`employees`流进行分组,按照部门进行分组,并将每个部门的员工薪水求平均值。最后使用`Collectors.collectingAndThen()`方法对平均值进行处理,保留2位小数并转换为`Double`类型。最终得到了一个`Map`对象,其中键为部门名称,值为该部门员工薪水的平均值。
Collectors.groupingBy
Collectors.groupingBy 是一个 Java 8 中的 Collector,它可以将一个 Stream 中的元素按照指定的分类函数分类,并将分类结果放入一个 Map 中。具体来说,它的语法为:
```
groupingBy(Function<? super T, ? extends K> classifier)
```
其中,`T` 是 Stream 中元素的类型,`K` 是分类结果的类型,`classifier` 是用于分类的函数。例如,可以将一个字符串数组按照字符串长度分类:
```
String[] words = {"apple", "banana", "orange", "pear"};
Map<Integer, List<String>> groups = Arrays.stream(words)
.collect(Collectors.groupingBy(String::length));
```
这将得到一个 Map,其中键为字符串长度,值为该长度下的所有字符串。在本例中,结果为 `{5=[apple], 6=[banana, orange], 4=[pear]}`。
阅读全文