利用Stream API进行文件处理

要求如下:

将文件中的地区信息提取出来,构造成District对象,其中城市为City对象,City对象中包含其所辖的地区集合。

文件内容如下:

地区 区号 邮编
广州市 020 510000
荔湾区 020 510000
越秀区 020 510000
海珠区 020 510000
天河区 020 510000
白云区 020 510000
黄埔区 020 510700
番禺区 020 511400
花都区 020 510800
南沙区 020 511400
萝岗区 020 510000
增城区 020 511300
从化区 020 510900

深圳市 0755 518000
罗湖区 0755 518000
福田区 0755 518000
南山区 0755 518000
宝安区 0755 518100
龙岗区 0755 518100
盐田区 0755 518000

珠海市 0756 519000
香洲区 0756 519000
斗门区 0756 519100
金湾区 0756 519090

佛山市 0757 528000
禅城区 0757 528000
南海区 0757 528200
顺德区 0757 528000
三水区 0757 528100
高明区 0757 528500

地区类District如下:

/**
 * 地区类
 *
 * @author yuwb
 * @date 18-8-20 下午3:12
 */
public class District {
    /**
     * 名称
     */
    private String name;
    /**
     * 区号
     */
    private String areaCode;
    /**
     * 邮编
     */
    private String zipCode;

    public District(String name, String areaCode, String zipCode) {
        this.name = name;
        this.areaCode = areaCode;
        this.zipCode = zipCode;
    }

    public District() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAreaCode() {
        return areaCode;
    }

    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
}

城市类City如下:

import java.util.List;

/**
 * 城市类
 *
 * @author yuwb
 * @date 18-8-20 下午3:14
 */
public class City extends District {

    public City(String name, String areaCode, String zipCode, List districts) {
        super(name, areaCode, zipCode);
        this.districts = districts;
    }

    public City(String name, String areaCode, String zipCode) {
        super(name, areaCode, zipCode);
    }

    public City(List districts) {
        this.districts = districts;
    }

    public City() {
    }

    /**
     * 该城市所管辖行政区列表
     */
    private List districts;

    public List getDistricts() {
        return districts;
    }

    public void setDistricts(List districts) {
        this.districts = districts;
    }
}

文件处理代码如下:

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toMap;

/**
 * 文件处理工具
 *
 * @author yuwb
 * @date 18-9-2 上午9:33
 */
public class FileUtils {

    /**
     * 利用流对文件内容进行处理
     *
     * @return 按格式输出的结果
     */
    public static HashMap readFileByStream() {
        HashMap result = new HashMap<>(16);

        try (Stream lines = Files.lines(Paths.get("city"), Charset.defaultCharset())) {
            //得到指定对象的集合
            List districtList = lines.map(line -> line.split(" ")).skip(1).filter(array -> array.length > 1).map(array -> new District(array[0], array[1], array[2])).collect(Collectors.toList());
            //以区号为分组,得到指定对象的集合
            Map> districtListMap = districtList.stream().filter(district -> district.getName().contains("区")).collect(groupingBy(District::getAreaCode));
            //生成以地区名字为键,地区对象为值的map
            Map districtMap = districtList.stream().collect(toMap(District::getName, district -> district));

            //对集合进行遍历,将地区注入到对应的市区中
            for (District district : districtMap.values()) {
                if (district.getName().contains("市")) {
                    for (Map.Entry> areas : districtListMap.entrySet()) {
                        if (Objects.equals(district.getAreaCode(), areas.getKey())) {
                            City city = new City(district.getName(), district.getAreaCode(), district.getZipCode(), areas.getValue());
                            districtMap.put(district.getName(), city);
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

代码来自GitHub:https://github.com/Yuwenbiao/utils.git

你可能感兴趣的:(利用Stream API进行文件处理)