java 映射施舍呢,Java 流收集映射

Java流 - Java流收集映射

我们可以从流中收集数据到映射。

在三个版本中重载的toMap()方法Collectors类返回一个收集器以在Map中收集数据。toMap(Function super T,? extends K> keyMapper, Function super T,? extends U> valueMapper)

toMap(Function super T,? extends K> keyMapper, Function super T,? extends U> valueMapper, BinaryOperator mergeFunction)

toMap(Function super T,? extends K> keyMapper, Function super T,? extends U> valueMapper, BinaryOperator mergeFunction, Supplier mapSupplier)toMap(Function super T,? extends K> keyMapper, Function super T,? extends U> valueMapper)

第一个版本有两个参数。这两个参数都是一个函数。

第一个参数将流元素映射到映射中的键。

第二个参数将流元素映射到映射中的值。

如果重复键,则抛出IllegalStateException。

以下代码在Map中收集员工的数据,其中的关键字是员工的ID,值是员工的姓名。import java.time.LocalDate;

import java.time.Month;

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) {

Map idToNameMap = Employee.persons()

.stream()

.collect(Collectors.toMap(Employee::getId, Employee::getName));

System.out.println(idToNameMap);

}

}

class Employee {

public static enum Gender {

MALE, FEMALE

}

private long id;

private String name;

private Gender gender;

private LocalDate dob;

private double income;

public Employee(long id, String name, Gender gender, LocalDate dob,

double income) {

this.id = id;

this.name = name;

this.gender = gender;

this.dob = dob;

this.income = income;

}

public long getId() {

return id;

}

public String getName() {

return name;

}

public static List persons() {

Employee p1 = new Employee(1, "Jake", Gender.MALE, LocalDate.of(1971,

Month.JANUARY, 1), 2343.0);

Employee p2 = new Employee(2, "Jack", Gender.MALE, LocalDate.of(1972,

Month.JULY, 21), 7100.0);

Employee p3 = new Employee(3, "Jane", Gender.FEMALE, LocalDate.of(1973,

Month.MAY, 29), 5455.0);

Employee p4 = new Employee(4, "Jode", Gender.MALE, LocalDate.of(1974,

Month.OCTOBER, 16), 1800.0);

Employee p5 = new Employee(5, "Jeny", Gender.FEMALE, LocalDate.of(1975,

Month.DECEMBER, 13), 1234.0);

Employee p6 = new Employee(6, "Jason", Gender.MALE, LocalDate.of(1976,

Month.JUNE, 9), 3211.0);

List persons = Arrays.asList(p1, p2, p3, p4, p5, p6);

return persons;

}

}

上面的代码生成以下结果。

8837734c3206f63754ad50c01e935bd6.png

例2

下面列出的第二种形式的toMap具有额外的合并函数。toMap(Function super T,? extends K> keyMapper, Function super T,? extends U> valueMapper, BinaryOperator mergeFunction)

合并函数传递重复键的旧值和新值。 该函数应合并两个值,并返回将用于键的新值。

以下代码显示如何连接所有男性和女性的名称。import java.time.LocalDate;

import java.time.Month;

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) {

Map genderToNamesMap =

Employee.persons()

.stream()

.collect(Collectors.toMap(Employee::getGender,

Employee::getName,

(oldValue, newValue) -> String.join(", ", oldValue, newValue)));

System.out.println(genderToNamesMap);

}

}

class Employee {

public static enum Gender {

MALE, FEMALE

}

private long id;

private String name;

private Gender gender;

private LocalDate dob;

private double income;

public Employee(long id, String name, Gender gender, LocalDate dob,

double income) {

this.id = id;

this.name = name;

this.gender = gender;

this.dob = dob;

this.income = income;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Gender getGender() {

return gender;

}

public static List persons() {

Employee p1 = new Employee(1, "Jake", Gender.MALE, LocalDate.of(1971,

Month.JANUARY, 1), 2343.0);

Employee p2 = new Employee(2, "Jack", Gender.MALE, LocalDate.of(1972,

Month.JULY, 21), 7100.0);

Employee p3 = new Employee(3, "Jane", Gender.FEMALE, LocalDate.of(1973,

Month.MAY, 29), 5455.0);

Employee p4 = new Employee(4, "Jode", Gender.MALE, LocalDate.of(1974,

Month.OCTOBER, 16), 1800.0);

Employee p5 = new Employee(5, "Jeny", Gender.FEMALE, LocalDate.of(1975,

Month.DECEMBER, 13), 1234.0);

Employee p6 = new Employee(6, "Jason", Gender.MALE, LocalDate.of(1976,

Month.JUNE, 9), 3211.0);

List persons = Arrays.asList(p1, p2, p3, p4, p5, p6);

return persons;

}

}

上面的代码生成以下结果。

b819da8dba8d32cfd7ce811ced6d32a9.png

例3

下面列出的第三个版本允许我们使用供应商提供一个Map对象。toMap(Function super T,? extends K> keyMapper, Function super T,? extends U> valueMapper, BinaryOperator mergeFunction, Supplier mapSupplier)

以下代码按性别总结人数。import java.time.LocalDate;

import java.time.Month;

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) {

Map countByGender = Employee.persons()

.stream()

.collect(Collectors.toMap(Employee::getGender, p -> 1L, (oldCount, newCount) -> newCount+oldCount));

System.out.println(countByGender);

}

}

class Employee {

public static enum Gender {

MALE, FEMALE

}

private long id;

private String name;

private Gender gender;

private LocalDate dob;

private double income;

public Employee(long id, String name, Gender gender, LocalDate dob,

double income) {

this.id = id;

this.name = name;

this.gender = gender;

this.dob = dob;

this.income = income;

}

public Gender getGender() {

return gender;

}

public static List persons() {

Employee p1 = new Employee(1, "Jake", Gender.MALE, LocalDate.of(1971,

Month.JANUARY, 1), 2343.0);

Employee p2 = new Employee(2, "Jack", Gender.MALE, LocalDate.of(1972,

Month.JULY, 21), 7100.0);

Employee p3 = new Employee(3, "Jane", Gender.FEMALE, LocalDate.of(1973,

Month.MAY, 29), 5455.0);

Employee p4 = new Employee(4, "Jode", Gender.MALE, LocalDate.of(1974,

Month.OCTOBER, 16), 1800.0);

Employee p5 = new Employee(5, "Jeny", Gender.FEMALE, LocalDate.of(1975,

Month.DECEMBER, 13), 1234.0);

Employee p6 = new Employee(6, "Jason", Gender.MALE, LocalDate.of(1976,

Month.JUNE, 9), 3211.0);

List persons = Arrays.asList(p1, p2, p3, p4, p5, p6);

return persons;

}

}

上面的代码生成以下结果。

fe8b410af3c43a6e4f182cf43c775498.png

例4

以下代码在映射中按性别取得最高收入。import java.time.LocalDate;

import java.time.Month;

import java.util.Arrays;

import java.util.List;

import java.util.Map;

import java.util.function.Function;

import java.util.stream.Collectors;

public class Main {

public static void main(String[] args) {

Map highestEarnerByGender = Employee.persons()

.stream()

.collect(Collectors.toMap(Employee::getGender, Function.identity(),

(oldPerson, newPerson) -> newPerson.getIncome() > oldPerson.getIncome() ? newPerson : oldPerson));

System.out.println(highestEarnerByGender);

}

}

class Employee {

public static enum Gender {

MALE, FEMALE

}

private long id;

private String name;

private Gender gender;

private LocalDate dob;

private double income;

public Employee(long id, String name, Gender gender, LocalDate dob,

double income) {

this.id = id;

this.name = name;

this.gender = gender;

this.dob = dob;

this.income = income;

}

public Gender getGender() {

return gender;

}

public double getIncome() {

return income;

}

public static List persons() {

Employee p1 = new Employee(1, "Jake", Gender.MALE, LocalDate.of(1971,

Month.JANUARY, 1), 2343.0);

Employee p2 = new Employee(2, "Jack", Gender.MALE, LocalDate.of(1972,

Month.JULY, 21), 7100.0);

Employee p3 = new Employee(3, "Jane", Gender.FEMALE, LocalDate.of(1973,

Month.MAY, 29), 5455.0);

Employee p4 = new Employee(4, "Jode", Gender.MALE, LocalDate.of(1974,

Month.OCTOBER, 16), 1800.0);

Employee p5 = new Employee(5, "Jeny", Gender.FEMALE, LocalDate.of(1975,

Month.DECEMBER, 13), 1234.0);

Employee p6 = new Employee(6, "Jason", Gender.MALE, LocalDate.of(1976,

Month.JUNE, 9), 3211.0);

List persons = Arrays.asList(p1, p2, p3, p4, p5, p6);

return persons;

}

@Override

public String toString() {

String str = String.format("(%s, %s, %s, %s, %.2f)\n", id, name, gender,

dob, income);

return str;

}

}

上面的代码生成以下结果。

45437c19a96438b9d24d9663a75d002a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值