繁体   English   中英

使用 Java Collections 和 Streams 拆分逗号分隔列表

[英]Splitting comma separated list using Java Collections and Streams

我正在使用 String 初始化一些数据,如下所示:

private String foods = "burgers:10,apples:20,soda:25"

...作为单个字符串传递到此方法中,如下所示:

public Map<String, String> getFoods() {
    return getCommaSeperatedFoodsMap(foods);
}

...调用此方法将数据拆分为相应的键/值:

public Map<String, String> getCommaSeperatedFoodsMap(String foods) {
        if (foods.isEmpty()) {
            return Maps.newHashMap();
        }
        Map<String, String> allFoods = Arrays.stream(foods.split(","))
                .map(s -> s.split(":"))
                .collect(Collectors.toMap(s -> s[0].trim(), s -> s[1].trim()));

        logger.info("Foods are:" + allFoods);

        return allFoods;
    }

然后我可以使用它来迭代每个 map 条目并将拆分字符串作为单独的参数传递给另一个方法:

public void createFoods() {
        vehicle.getFoods().forEach(this::createFoodData);
 }

public void createFoodData(String foodType, String price) {
//....use data in this method

我的问题是,我希望能够传递一个 String 并在每个,分隔符上拆分 4 个值,如下所示:

private String foods = "1:burgers:10:new,2:apples:20:old,3:soda:25:new"

...因此我需要拆分 4 :分隔值并将它们作为 String 参数像以前一样传递给createFoodData(String number, String foodType, String price, String age)然后将采用 4 个参数,例如

iteration 1: '1', 'burgers', '10', 'new'
iteration 2: '2', 'apples', '20', 'old'
etc...

我应该使用哪个 Collection / interface 来实现这个? 我已经离开 Java 一段时间了,需要一些提示。

应创建包含四个字段的 class FoodData (例如,使用 Lombok 的@Data@AllArgsConstructor注释):

@Data
@AllArgsConstructor
class FoodData {
    private String 
        number, 
        foodType, 
        price, 
        age;

    public FoodData(String ... arr) {
        this(arr[0], arr[1], arr[2], arr[3]);
    }
}

然后可以重构方法getFoods()以立即返回FoodData列表,而无需迭代 map 并调用createFoodData

public List<FoodData> getFoodData(String foods) {
    return Arrays.stream(foods.split("\\s*,\\s*")) // Stream<String>
            .map(row -> row.split(":"))            // Stream<String[]>
            .map(FoodData::new)                    // Stream<FoodData>
            .collect(Collectors.toList());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM