您如何使用Java Stream API根据存储在对象内部的信息将对象列表转换为嵌套映射?

杰克·弗雷尔:

我有对象的列表List<SingleDay>,其中SingleDay

class SingleDay{ 
      private Date date;
      private String County;

   // otherstuff
}

我希望将此列表转换为Map<Date, Map<String, SingleDay>>也就是说,我希望从Date到Counties的地图都回到原始对象。

例如:
02/12/2020 : { "Rockbridge": {SingleDayObject}}

如果从对象列表到地图,而不是从对象列表到嵌套地图,那么我什么都无法工作,也无法在线找到所有内容。

基本上,我希望能够快速查询与日期和县相对应的对象。

谢谢!

编辑:

import java.io.FileReader;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;



public class DataParser {

    private List<SingleDay> data;
    private String filename;

    public DataParser(String filename) {
        data = new ArrayList<>();
        this.filename = filename;
    }

    public void parse() {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/uuuu");

        try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
            String line = br.readLine();
            line = br.readLine(); // read and consume header line

            while (line != null) {
                String[] values = line.split(",");
                LocalDate d = LocalDate.parse(values[0], formatter);

                data.add(new SingleDay(d, values[2], values[3], Integer.parseInt(values[4]), Integer.parseInt(values[6])));
                line = br.readLine();
            }
            br.close();
        } 
        catch(Exception e) {
            System.out.println(e);
        }

// error here
        Map<Date, Map<String, SingleDay>> result = data.stream().collect(Collectors.toMap(SingleDay::getDate,
                sd -> list.stream().collect(Collectors.toMap(SingleDay::getCounty, e -> e))));

    } 
Arvind Kumar Avinash:

如下进行:

Map<LocalDate, Map<String, SingleDay>> result = list.stream()
                .collect(Collectors.toMap(SingleDay::getDate, v -> Map.of(v.getCounty(), v)));

演示:

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class SingleDay {
    private LocalDate date;
    private String County;

    public SingleDay(LocalDate date, String county) {
        this.date = date;
        County = county;
    }

    public LocalDate getDate() {
        return date;
    }

    public String getCounty() {
        return County;
    }

    @Override
    public String toString() {
        return "SingleDay [date=" + date + ", County=" + County + "]";
    }
    // otherstuff
}

public class Main {
    public static void main(String[] args) {
        List<SingleDay> list = List.of(new SingleDay(LocalDate.now(), "X"),
                new SingleDay(LocalDate.now().plusDays(1), "Y"), new SingleDay(LocalDate.now().plusDays(2), "Z"));

        Map<LocalDate, Map<String, SingleDay>> result = list.stream()
                .collect(Collectors.toMap(SingleDay::getDate, v -> Map.of(v.getCounty(), v)));

        // Display
        result.forEach((k, v) -> System.out.println("Key: " + k + ", Value: " + v));
    }
}

输出:

Key: 2020-05-27, Value: {Z=SingleDay [date=2020-05-27, County=Z]}
Key: 2020-05-26, Value: {Y=SingleDay [date=2020-05-26, County=Y]}
Key: 2020-05-25, Value: {X=SingleDay [date=2020-05-25, County=X]}

注意:我使用的LocalDate不是过时的java.util.Date我强烈建议您使用java.timeAPI而不是break java.util.Date选中此项以了解更多信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

您如何使用Java Stream API根据存储在对象内部的信息将对象列表转换为嵌套映射?

如何使用Stream API从对象检索嵌套列表?

Java Stream从对象列表生成映射

使用 Java 中的 Stream 从嵌套的对象列表中过滤/删除

JAVA:在使用 Stream API 的条件下划分用户对象列表并转换为 Map<String,String>

如何使用Stream过滤嵌套对象?

如何使用 Stream API 在 Java 中将数组转换为 HashMap

如何使用 Java Stream 转换这段代码

使用 Stream 过滤对象列表

Java 8 Stream从对象映射创建对象

使用 stream() 将嵌套列表转换为列表

如何在Java Stream API中类型转换对象?

如何使用jq将对象列表转换为列表对象?

Java Stream 如何使用 .stream()

如何使用流将嵌套对象列表转换为具有相似信息的对象列表

如何使用Java 8 Stream API将特定对象移动到列表的开头?

Javascript:使用groupBy将对象列表转换为嵌套对象列表

Java Stream 映射或创建 FileStream 的新对象

如何在Java 8中将对象列表转换为映射?

比较键后如何将对象列表转换为嵌套对象

如何使用Ramda将对象映射转换为数组?

如何使用lambdas /流将对象的嵌套列表转换为地图(Map <Integer,Map <Integer,Object >>)

从列表到使用 Stream 映射

将对象数组列表转换为Java中的对象列表

Java Stream of Integer数组以返回对象列表

如何将对象键转换为嵌套对象

如何将对象数组转换为嵌套对象?

Java Stream API映射参数

使用Ramda将对象数组转换为嵌套对象